Как считаете, интерфейсы стоит создавать под клиента/задачу, или же максимально универсальными, не привязанными к контексту?
пример:
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, но, возможно, какие-нибудь декорации.