"Парень из выше говорит, что он создает другой интерфейс для обработки новых членов. Ничего не ломается.
Разве это не композиция? Почему бы не использовать композицию без интерфейсов? Более гибкий. "
Кажется, вы думаете о композиции с точки зрения наследования, например: «Я унаследую все эти возможности в одном объекте для выполнения этой работы». Это плохой способ написания кода. Это все равно, что сказать: «Я хочу построить небоскреб, поэтому я изучу каждую имеющуюся работу: от создания чертежей до того, как разрушить фундамент и установить освещение ...»
Вместо этого думайте о композиции в терминах отдельных объектов, каждый из которых выполняет одну задачу. Чтобы выполнить сложную работу, теперь я могу полагаться на эти отдельные объекты для выполнения их отдельных задач. Это все равно что нанять архитектора и строительную бригаду, чтобы построить небоскреб. Мне не нужно знать в мельчайших деталях, как каждый из них выполняет свою работу, просто чтобы они могли это сделать. В коде это означает внедрение зависимостей в объект для выполнения сложных задач вместо наследования.
Так куда же подходят интерфейсы? Это контракт между отдельными объектами. Они дают вам возможность не заботиться об отдельных, конкретных реализациях. Они позволяют вам говорить на общем языке с кучей объектов, которые несут одинаковую ответственность, но на самом деле могут иметь разную реализацию. Интерфейс становится абстракцией для объекта, выполняющего задачу. Мне не нужно знать, как работает каждый парень с молотком, только то, что он знает, как хитнуть ().
Когда вы начинаете составлять сложную систему кода с множеством небольших классов, которые несут одну ответственность, вы вскоре узнаете, что можете столкнуться с серьезными проблемами, если слишком сильно полагаетесь на конкретную реализацию данного класса и этот класс начинает меняться ... Поэтому вместо того, чтобы полагаться на конкретную реализацию, мы создаем интерфейс - абстракцию. И мы говорим: «Мне все равно, как вы делаете JobX, только то, что вы делаете это».
Существуют и другие преимущества для интерфейсов, такие как тестирование, макетирование и т. Д. Но они не являются причиной для кодирования интерфейса. Причина в том, чтобы создать систему кода, которая не зависит от специфики и, таким образом, тесно связана друг с другом. Вот почему, думая о графике, вы должны бояться связывать кучу конкретных классов друг с другом. Потому что изменения в одном из этих классов вызовут волновой эффект.
Когда вы связываете себя с абстракцией вместо конкретного класса, вы ограничиваете связь. Вы говорите, что я собираюсь быть связанным только с договором, о котором мы оба договорились, и больше ничего ». И если класс, реализующий этот контракт, изменит свой внутренний способ выполнения своей задачи, вам все равно, потому что вы не полагаетесь на неконтрактное свойство или метод. Вы полагаетесь только на согласованный договор.