LINUX.ORG.RU

История изменений

Исправление sanyo1234, (текущая версия) :

Чет я пропустил это решение. Скинь, пожалуйста, ссылку.

Стоимость строки кода в разных регионах и на удалёнке (комментарий)

Но я приведу пример того, почему я называю наследование негибким. Есть Event и Day — несколько типов объектов, на которые можно подписаться. Допустим, в нашей системе они настолько родственны, что есть основание создать родительский класс Subscribable и включить в него значительную часть общей реализации.

В этот момент происходит привязка к реализации, что нарушает принцип инкапсуляции.

Какой именно принцип инкапсуляции был нарушен с твоей точки зрения?

Ты не можешь легко заменить Subscribable на, допустим, IntenseSubscribable — то же самое поведение, но с другой механикой.

Если пришлось бы менять родительский класс, то это неправильная попыткая использования наследования?

Или нам нужно множественное наследование с вытекающими проблемами совместимости (нам нужна будет только часть одной из наследуемых реализаций, другая часть будет противоречить дизайну).

Множественное наследование не приветствуется ни в Java, ни в C#.

Эти две особенности—нарушение инкапсуляции и необходимость выбора иерархии—я и называю негибкими.

Твой пример просто не подходит для наследования, только и всего.

Понять других людей важнее, чем опровергнуть.

Чтобы опровергнуть, если есть объективные причины для опровержения, нужно хорошо понять оппонента.

Личный опыт, сравнение с другими нежелательными аспектами создания программ (примеры есть в том же сообщении).

Композиция может использоваться одновременно с наследованием. Ненужно пытаться впихнуть в невпихуемое.

Сокращает ли наследование реализации код? Возможно.

Не возможно, а точно.

Как и процедуры.

ООП с наследованием намного сильнее сокращает код при правильном использовании, чем процедурное программирование, я уже устал объяснять.

Позволяет ли оно более просто воспринимать программу? С этим сложнее. Я не уверен.

Как раз позволяет при правильном использовании.

Я не хотел сказать, что процедуры могут сравниться или даже опередить наследование в смертельной схватке за истребление объёма кода. Я говорил о том, что это не самое главное. Говорил без деталей, но всё-таки об этом.

Главное для чего?

Композиция обозначает комбинирование нескольких абстракций в более сложные, при этом не нарушая инкапсуляцию.

Можно накидать кривых примеров и для композиции.

Опять же, здесь существенная характеристика — абстракции. Выберешь нужные абстракции, будешь их правильно использовать — количество кода сократится.

Но при правильном использовании наследования количество кода может быть сильно меньше, чем при использовании композиции.

Исправление sanyo1234, :

Чет я пропустил это решение. Скинь, пожалуйста, ссылку.

Стоимость строки кода в разных регионах и на удалёнке (комментарий)

Но я приведу пример того, почему я называю наследование негибким. Есть Event и Day — несколько типов объектов, на которые можно подписаться. Допустим, в нашей системе они настолько родственны, что есть основание создать родительский класс Subscribable и включить в него значительную часть общей реализации.

В этот момент происходит привязка к реализации, что нарушает принцип инкапсуляции.

Какой именно принцип инкапсуляции был нарушен с твоей точки зрения?

Ты не можешь легко заменить Subscribable на, допустим, IntenseSubscribable — то же самое поведение, но с другой механикой.

Если пришлось бы менять родительский класс, то это неправильная попыткая использования наследования?

Или нам нужно множественное наследование с вытекающими проблемами совместимости (нам нужна будет только часть одной из наследуемых реализаций, другая часть будет противоречить дизайну).

Множественное наследование не приветствуется ни в Java, ни в C#.

Эти две особенности—нарушение инкапсуляции и необходимость выбора иерархии—я и называю негибкими.

Твой пример просто не подходит для наследования, только и всего.

Понять других людей важнее, чем опровергнуть.

Чтобы опровергнуть, если есть объективные причины для опровержения, нужно хорошо понять оппонента.

Личный опыт, сравнение с другими нежелательными аспектами создания программ (примеры есть в том же сообщении).

Композиция может использоваться одновременно с наследованием. Ненужно пытаться впихнуть в невпихуемое.

Сокращает ли наследование реализации код? Возможно.

Не возможно, а точно.

Как и процедуры.

ООП с наследованием намного сильнее сокращает код при правильном использовании, чем процедурное программирование, я уже устал объяснять.

Позволяет ли оно более просто воспринимать программу? С этим сложнее. Я не уверен.

Как раз позволяет при правильном использовании.

Я не хотел сказать, что процедуры могут сравниться или даже опередить наследование в смертельной схватке за истребление объёма кода. Я говорил о том, что это не самое главное. Говорил без деталей, но всё-таки об этом.

Главное для чего?

Композиция обозначает комбинирование нескольких абстракций в более сложные, при этом не нарушая инкапсуляцию.

Можно накидать кривых примеров и для композиции.

Опять же, здесь существенная характеристика — абстракции. Выберешь нужные абстракции, будешь их правильно использовать — количество кода сократится.

Но при использовании наследования количество кода может быть сильно меньше, чем при использовании композиции.

Исходная версия sanyo1234, :

Чет я пропустил это решение. Скинь, пожалуйста, ссылку.

Стоимость строки кода в разных регионах и на удалёнке (комментарий)

Но я приведу пример того, почему я называю наследование негибким. Есть Event и Day — несколько типов объектов, на которые можно подписаться. Допустим, в нашей системе они настолько родственны, что есть основание создать родительский класс Subscribable и включить в него значительную часть общей реализации.

В этот момент происходит привязка к реализации, что нарушает принцип инкапсуляции.

Какой именно принцип инкапсуляции был нарушен с твоей точки зрения?

Ты не можешь легко заменить Subscribable на, допустим, IntenseSubscribable — то же самое поведение, но с другой механикой.

Если пришлось бы менять родительский класс, то это неправильная попыткая использования наследования?

Или нам нужно множественное наследование с вытекающими проблемами совместимости (нам нужна будет только часть одной из наследуемых реализаций, другая часть будет противоречить дизайну).

Множественное наследование не приветствуется ни в Java, ни в C#.

Эти две особенности—нарушение инкапсуляции и необходимость выбора иерархии—я и называю негибкими.

Твой пример просто не подходит для наследования, только и всего.

Понять других людей важнее, чем опровергнуть.

Чтобы опровергнуть, если есть объективные причины для опровержения, нужно хорошо понять оппонента.

Личный опыт, сравнение с другими нежелательными аспектами создания программ (примеры есть в том же сообщении).

Композиция может использоваться одновременно с наследованием. Ненужно пытаться впихнуть в невпихуемое.

Сокращает ли наследование реализации код? Возможно.

Не возможно, а точно.

Как и процедуры.

ООП с наследованием намного сильнее сокращает код при правильном использовании, чем процедурное программирование, я уже устал объяснять.

Позволяет ли оно более просто воспринимать программу? С этим сложнее. Я не уверен.

Как раз позволяет при правильном использовании.

Я не хотел сказать, что процедуры могут сравниться или даже опередить наследование в смертельной схватке за истребление объёма кода. Я говорил о том, что это не самое главное. Говорил без деталей, но всё-таки об этом.

Главное для чего?

Композиция обозначает комбинирование нескольких абстракций в более сложные, при этом не нарушая инкапсуляцию.

Можно накидать кривых примеров и для композиции.

Опять же, здесь существенная характеристика — абстракции. Выберешь нужные абстракции, будешь их правильно использовать — количество кода сократится.

Но при использовании наследования количество кода может быть сильно меньше, чем при использовании композиции.