2015-04-17 5 views
1

Моего языка C++, но я чувствую, что ответ должен быть общимИнкапсуляции против Наследования

я могу выбрать между два вариантом для моего класса, B:

1) имеет B наследоваться от А, и сделать некоторые из методы виртуального

2) Объявите экземпляр A в пределах B.

Этот вопрос о том, что является оптимальным с точки зрения времени выполнения, так как оба будут работать нормально.

Я думаю, что вариант 1 менее оптимален для экземпляров A и B, потому что во время выполнения имеется слой косвенности, поскольку правильная функция выбирается из таблицы V.

Это правильно?

+4

, если у вас нет ОЧЕНЬ разумной причины, лучше беспокоиться о удобочитаемости и ремонтопригодности, чем беспокоиться о том, сколько раз вы разыскиваете указатель –

+0

«Что оптимально» почти всегда сводится к проблемам, зависящим от компилятора и платформы. Используйте профилировщик, измерьте различия. – Almo

+0

Joshua Block посвящает целый предмет в своей книге «Эффективная Java», 2-е изд. «Использовать состав над наследованием». Причины убедительны. Это предполагает, что вы одобряете подход 2. Причины одобрения подхода 1 были бы, если B действительно является A-и-A, был разработан и надлежащим образом документирован для наследования. В большинстве случаев различия в производительности, связанные только с наследованием по сравнению с составом (включая переадресацию метода), будут тривиальными ... что вы должны выбрать дизайн, который имеет наибольший смысл (как указано выше). – scottb

ответ

3

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

Для варианта 1, B является А.

Для варианта 2, B имеет А.

Если код производительности критически, вы должны реализовать и протестировать обе версии, как упоминалось Альмо.

+0

Немного несвязанный, но что подразумевается под «критичным по производительности»? Разве это не общая цель, чтобы программа работала как можно быстрее? Я понимаю, что избегаю преждевременной оптимизации, но что такое пример приложения, который будет «критичным по производительности»? – Carcigenicate

+0

Это хороший вопрос. Часто часто требуется скорость, но на самом деле она не нужна. Пока программа достаточно быстрая, гораздо важнее, что она действительно правильная. Чтобы убедиться, что это правильно, программисту (программистам) должно быть легко понять код. – mbmcavoy

+0

Критически важные приложения будут в тех случаях, когда существует риск не быть «достаточно быстрым». Подумайте о научных анализах или симуляциях, которые занимают много времени, и о четком графике проекта, графическом движке видеоигр, который должен работать плавно, чтобы быть принятым игроками, или системе управления, которая должна работать в режиме реального времени на ограниченном оборудовании. Основное приложение для ввода данных не было бы критичным по производительности, так как существует небольшой риск того, что компьютер может не отставать от машинистки. – mbmcavoy