@random55

Какие стоит создавать интерфейсы?

Как считаете, интерфейсы стоит создавать под клиента/задачу, или же максимально универсальными, не привязанными к контексту?

пример:

interface IPerson
{
    public function move();
    public function eat();
    public function sleep();
    public function work();
}


или же

interface IMove
{
    public function move();
}

interface IEat
{
    public function eat();
}

interface ISleep
{
    public function sleep();
}

interface IWork
{
    public function work();
}


Первый подход ограничивает использование интерфейса некоторым модулем, ведь он описывает персону, а не черты поведения в отдельности. А если бы, допустим, в у нас был отдельный интерфейс IMove, то мы смогли бы реализовать его в каком угодно модуле/компоненте, например в условном File, ведь мы можем переместить файл. Так же и с ISleep, мало ли что может уснуть, начиная от операционной системы или потока выполнения, заканчивая персонажем в тамагочи.

Но смущает одно, IMove::move() для персонажа игры, скорее всего, будет принимать x,y координаты, а для файла - конечный путь.

Стоит ли заморачиваться, и искать общее у совсем разнородных предметов и явлений, чтобы интерфейсы можно было вывалить в одну кучу в единой директории, или это крайность?

UPD: Подумал тут, если файл и персонаж игры - совсем разные вещи, то внутри логики игры двигать по координатам может понадобиться не только что-то, что реализует Person, но, возможно, какие-нибудь декорации.
  • Вопрос задан
  • 130 просмотров
Решения вопроса 2
@Akela_wolf
Extreme Programmer
А если бы, допустим, в у нас был отдельный интерфейс IMove, то мы смогли бы реализовать его в каком угодно модуле/компоненте, например в условном File, ведь мы можем переместить файл. Так же и с ISleep, мало ли что может уснуть, начиная от операционной системы или потока выполнения, заканчивая персонажем в тамагочи.


Неверно. IMove (точнее будет назвать Movable) имеет смысл в контексте какой-то предметной области. И перемещение файла, перемещение спрайта, перемещение трехмерного объекта, перемещение руки робота - все это разные перемещения. Соответственно и интерфейсы будут разные (расположенные в разных модулях, даже если будут называться одинаково), например:
filesystem.Movable
graphics.2d.Movable
graphics.3d.Movable
servo.Movable


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

Вообще главный принцип тут такой: интерфейс должен иметь смысл, описывать некоторую единицу функциональности именно с точки зрения предметной области. Скажем, если в вашей предметной области операция move имеет смысл без операций eat и sleep - её можно выделить в отдельный интерфейс (а можно и не выделять, это зависит от других факторов). Если же операции eat и sleep всегда должны ходить парой и каждый потребитель этого интерфейса нуждается в обеих операциях - они должны быть в одном интерфейсе.
Ответ написан
Alexandroppolus
@Alexandroppolus
кодир
4 принцип SOLID предписывает создавать настолько маленькие, насколько возможно. При этом реализация может имплементировать несколько интерфейсов.

Но смущает одно, IMove::move() для персонажа игры, скорее всего, будет принимать x,y координаты, а для файла - конечный путь.

да. Это совершенно разные интерфейсы. Всё правильно.
Person заимплементит IMove с координатами, а File - с путем.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы