2015-06-11 2 views
3

Объектно-ориентированный дизайн - довольно аккуратная концепция, но я изо всех сил пытаюсь обернуть голову вокруг большинства ее граней. Я думаю, что ключ к хорошему объектно-ориентированному дизайну - это хорошее понимание того, как смотреть на него. Я обычно смотрю на объектно-ориентированном таким образом:Как обернуть голову вокруг объектно-ориентированного дизайна

Классы Реальные объекты или объекты

Instance Поля являются атрибутами лица, («есть»)

методы, как действия, глаголы, субъекта умения

Интерфейсы похожи на способности, которые вы можете наложить на объект. Это также может быть отношение «есть или может», реализации которого не заданы в камне. Супермен - Криптон, являющийся криптониасом, обладает набором специальных способностей, таких как полет, замерзание и т. Д. Супермен летает от Зеленого Фонаря и Гоку и особенно Бэтмена, поэтому Flight как интерфейс, вероятно, хорошая идея, если вы создавая вымышленную Вселенную.

public class SuperMan extends Man implements Kryptonian{} 

public interface Kryptonian extends Flight, FreezeBreath{ 
    public void fly(); 
    public void coolBreath(); 
} 

Проблема возникает, когда вы добавляете Generics в микс? Поскольку заданные параметры типа каким-то образом создают контракт между классом/интерфейсом и типом.

public interface Flight<T>{ 
    public void fly(T t); 
} 

В этом примере Полет связан с Т, Т может быть супергероем птица или что-нибудь, что может fly.But в том, что на самом деле, как я себе это представляешь? Потому что это похоже на то, что делают простые интерфейсы? Хотя, параметризованный интерфейс все еще является интерфейсом, связь с типом T - это то, что меня действительно беспокоит. Более того, вещи также усложняются, когда вы добавляете ограниченное ограничение на тип параметра.

public class Pidgey<T extends Bird> implements Flight<T>{} 

Какой реальный конкретный объект вы можете определить T с? Вышеприведенный пример довольно ошибочен, хотя использование параметра класса также ограничивает тип полета, вероятно, хороший дизайн, потому что Flight все еще достаточно независим, чтобы другие классы все еще могли использовать его без каких-либо ограничений. Но сам пример неверен. Пиджи - это птица, которая может летать, но что может быть Т? Ну, T может быть чем угодно, это может быть другой объект или способности. Вопрос в том, каковы его последствия, зачем поставить T там? Что это за реальные примеры?

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

public class WaterBottle<T extends Liquid> implements UniqueCap{} 

Но я видел, что дженерики используются не только на контейнероподобных объектах? Как можно проектировать такие объекты, что они рассматривали?

+4

Технические возможности Супермена зависят от того, где он находится. –

+0

Где вы видели это использование дженериков? –

+4

В духе объектов, представляющих «реальные вещи» (которые, как я не думаю, действительно является объектно-ориентированным программированием), вы всегда можете иметь что-то вроде «публичного интерфейса Flock », где стадо представляет собой группу птицы - это все еще контейнер (по существу). – Jared

ответ

4

Ваши аналогия с различными функциями ООП определенно действительны. Дженерики определенно имеют наибольший смысл, когда речь идет о коллекциях/контейнерах/хэшмапах. Тем не менее, они используют их в других местах. Например, если банк хочет обрабатывать ноты во многих валютах, они могут написать общественного класс moneyProcessor

Однако дженерик не требуется. В контексте вашего интерфейса Flight не было бы большой причины использовать дженерики. Что приводит меня к другому моменту:

Просто потому, что кто-то делает что-то в одном направлении, это не значит, что вам нужно это делать. OOP очень гибкий по причине. Там всегда более одного правильного пути. Если метод принимает параметр Object в качестве параметра, это еще не конец света. Просто убедитесь, что вы можете прочитать его позже. :)

Редактировать: и другие могут его прочитать.

0

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

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