2013-12-02 2 views
0

я читал стив Yegge в «на 5 основных вопросах телефона-экран», а готовимся к интервью приходят на следующей неделе, и я столкнулся с этой выдержкой:OO дизайн интервью

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

Будучи довольно неопытным с дизайном ОО, я пытаюсь понять, почему это нарушенное предположение?

ответ

5

Добавление к ответу Эвана:

Когда речь заходит о наследовании, уважая «является» (или «является своего рода») отношения - это не вся история.

Хороший дизайн также несет в себе LSP (принцип замены Лискова). Принцип гласит, что если B является подтипом A, то A можно заменить на B без каких-либо удивительных эффектов. Например, любой код, который работает с Vehicle, также будет работать с Car.

Классический пример, показывающий, как легко разбить этот принцип, является пример Square-Rectangle.

На первый взгляд кажется очевидным, что Square наследуется от Rectangle. Квадрат - это своего рода «Прямоугольник». Это прямоугольник, ширина и высота которого всегда одинаковы. Для того, чтобы сохранить это свойство, вы, вероятно, создать свой класс Square, как это:

public class Square : Rectangle 
{  
    //SetWidth method inherited from Rectangle 
    public override void SetWidth(int width) { 
    base.width = width; 
    base.height = width; 
    } 
} 

Perfect. Но теперь, представьте следующий код:

public void SomeMethod(Rectangle rect) { 
    rect.SetHeight(10); 
    rect.SetWidth(20); 
    print(rect.GetHeight()); 
} 

Этот код будет ожидать, что третья строка для печати 10, так как он просто установить высоту прямоугольника до 10. Однако, если заменить на площади, было бы напечатать 20 вместо этого, вызывая неожиданное поведение - и нарушая Принцип замещения Лискова. Таким образом, мы видим, что прямоугольник не всегда может быть заменен квадратом.

КМПА является одним из пяти принципов SOLID - я рекомендую прочитать больше о другой 4.

Если вы ищете хороший OO книгу, я должен сказать, что шаблоны Head First Design адские книгу, лучшее, что я когда-либо читал. Это немного связано с java, но только немного, они используют его для образцов кода и ничего больше. Предполагается, что он не зависит от языка, и вы можете прочитать его независимо от вашего программирования.

+0

Большое спасибо за ваш время и этот отличный ответ. Не могли бы вы просто рассказать мне, какие еще 4 СОВЕТА, которые вы рекомендуете мне читать? – user3043746

+0

@ user3043746 [S (Единая ответственность)] (http://www.oodesign.com/single-responsibility-principle.html) [O (Открыть Закрыть)] (http://www.oodesign.com/open-close -principle.html) [L (замена Лискова)] (http://www.oodesign.com/liskov-s-substitution-principle.html) [I (Сегрегирование интерфейса)] (http://www.oodesign.com /interface-segregation-principle.html) [D (инверсия зависимостей)] (http://www.oodesign.com/dependency-inversion-principle.html). Они необходимы для разработки гибкого и удобного в использовании приложения, а также большой трюк, который поможет вам во время интервью. – dcastro

3

Наследование - это «есть» отношение.

A Car является Vehicle.

A Vehicle является не a ParkingGarage.

ParkingGarage может содержать много Vehicles, но это композиция, а не наследованию

+0

Спасибо.Могу ли я, возможно, попросить некоторую рекомендацию относительно хорошего материала, связанного с ОО? Кажется, я не могу найти одну книгу/учебник, язык которого не является агностиком (или, в частности, сфокусирован на Python). – user3043746

+1

«Code Complete» - идеальный выбор, когда дело касается OO и лучших практик ... – BDR

Смежные вопросы