Если класс наследуется много раз, может быть медленнее? - PullRequest
3 голосов
/ 04 июня 2010

Когда я пытаюсь создать хорошую иерархию объектов, которая поможет писать меньше кода и избежать использования ненужных полей, я чувствую себя свободным в создании многих базовых классов для хорошей группировки, которая обычно абстрактна. Что может быть недостатком в этом? Много раз унаследованный класс может быть медленнее? Видеть много ненужных абстрактных классов, которые не имеют достаточно хороших имен, может вызвать путаницу, когда они встречаются с ней в смысле intelli (автозаполнение)? Что может быть другим?

Ответы [ 4 ]

10 голосов
/ 04 июня 2010

Много раз унаследованный класс может быть медленнее?

Есть только один способ ответить на вопросы производительности: попробуйте оба способа и оцените результаты.Тогда вы узнаете.

Что может быть недостатком в том, чтобы делать это так?

Недостаток чрезмерно сложных иерархий объектов:

1) они сбивают с толку, поскольку представляют понятия, не входящие в сферу бизнеса

Например, выВозможно, вы захотите иметь систему хранения, которая может хранить информацию о сотрудниках, компьютерах и конференц-залах.Итак, у вас есть классы StorableObject, Employee, Room, Computer, где Employee, Room и Computer наследуются от StorableObject.Вы имеете в виду «StorableObject», чтобы представить что-то о вашей реализации вашей базы данных .Кто-то наивно читает ваш код и спрашивает: «Почему человек является« хранимым объектом »? Конечно, компьютер - это хранимый объект, а комната - это место, где он хранится. Когда вы смешиваете механизмы общего ресурсакод со значением , означающим отношения «это своего рода» в бизнес-сфере, все запутывается.

2) вы получаете только один «стержень наследования» в C #; это единственныйЯзык наследования. Когда вы делаете выбор использовать наследование для одной вещи, это означает, что вы решили НЕ использовать наследование для чего-то другого. Если вы создаете базовый класс Vehicle и производные классы MilitaryVehicle и CivilianVehicle, то вы просто выбрали не имеют самолеты базового класса, потому что самолеты могут быть как гражданскими, так и военными.

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

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

4 голосов
/ 04 июня 2010

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

2 голосов
/ 13 января 2014

Я только что сделал очень простой практический тест (хотя и ненаучный), в котором я создал пустые классы с именами A, B, C ... Q, где B наследуется от A, C от B и так далее, до Q наследуется от P.

При попытке получить некоторые метрики для этого я создал несколько циклов, в которых я просто создал x количество объектов A, x количество объектов B и т. Д.

Эти классы пустые и содержат только конструктор по умолчанию.

Исходя из этого, я мог видеть, что если создание объекта типа А заняло 1 секунду (в масштабе), то создание объекта типа Q заняло 7-8 секунд.

Таким образом, ответ должен быть ДА, слишком глубокая иерархия повлияет на производительность. Если это заметно, то зависит от многих вещей и от того, сколько объектов вы создаете.

2 голосов
/ 04 июня 2010

Если вы не выполняете рефлексию или что-то подобное, когда ваш код должен обходить дерево наследования во время выполнения, вы не должны видеть никаких различий в скорости, независимо от того, сколько уровней наследования имеет класс или как многие классы реализуют ваш конкретный класс.

Самым большим недостатком будет сделать ваш код излишне хрупким.

Если класс B реализует / наследует A только потому, что B потребуются аналогичные поля, вы окажетесь в мире боли через шесть месяцев, когда решите, что они должны вести себя по-разному от A до B. В этом отношении Я повторю k_b, предложив вам посмотреть на шаблон Composition.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...