LINUX.ORG.RU

[ООП] Интерфейсы

 


0

2

Я привык при программировании «вслушиваться» в код, анализируя его с точки зрения понятности и логичности. Хороший код в моем понимании как складный рассказ. Поэтому многие вещи я делают интуитивно.

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

Суть спора в следующем: товарищ сторонник того, что бы на каждый класс клепать интерфейс. Я в общем-то интуитивно понимаю, что это действие когда-то имеет смысл, а когда-то нет. Проблема в том, что когда какой-то код не имеет смысла, то он как бы незаконно занимает место и только напрасно засоряет проект. Поэтому все же стоит различать когда надо, а когда нет и не делать «на всякий случай».

Попытался для себя составить список когда интерфейс нужен:

1. Есть несколько реализаций. Самый очевидный случай.
2. Реализация одна, но как бы подразумевается, что может быть несколько.

Есть еще такая штука: сегодня реализация одна, а завтра станет несколько. Но я считаю, что это не повод засорять код, рефакторинг «выделение интерфейса» - очень простой.

Больше не придумал. С моей точки зрения во всех остальных случаях класс вполне способен жить сам по себе.

★★★★★
Ответ на: комментарий от dizza

> Ко внешнему API нужно применять как можно больше практик по уменьшению связности. Обязательные тривиальные getters/setters даже для тупых записей, например.

Твои «обязательные применения как можно большего числа практик» - это то же самое, что создавать интерфейс на каждый класс. Нет фиксированных рецептов конструирования приличного API - всегда должна быть версия 0, которую постоянно ломают и которая несовместима сама с собой.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

всегда должна быть версия 0, которую постоянно ломают и которая несовместима сама с собой.

А нафига так делать? Когда я хочу переименовать метод в публичном API, я старый делаю @Deprecated и добавляю метод с новым именем. Вот поэтому всякие кодовые прослойки вроде акцессоров и интерфейсов для апи полезны - там любое изменение критично тем, что кому-то может поломать код. В кишках же своего проекта мне рефакторить не проблема совершенно.

dizza ★★★★★
() автор топика
Ответ на: комментарий от dizza

>> всегда должна быть версия 0, которую постоянно ломают и которая несовместима сама с собой.

А нафига так делать?

Потому что вот это:

dizza> Когда я хочу переименовать метод в публичном API, я старый делаю @Deprecated и добавляю метод с новым именем

Слова маленького мальчика, который научился пИсать сам и горд этим^W^W^W^W^W^W^W^W^W^Wдополнительная нагрузка, которой лучше избежать.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Нет фиксированных рецептов конструирования приличного API - практически всегда бывает версия 0, которую постоянно ломают и которая несовместима сама с собой.

//fixed

shty ★★★★★
()
Ответ на: комментарий от tailgunner

дополнительная нагрузка, которой лучше избежать.

Спорить не буду. Но раньше избегал. Но вот когда стал работать в компании, где куча сервисов/либ и тому подобного понял, что если делать по-другому будет хаос.

dizza ★★★★★
() автор топика
Ответ на: комментарий от dizza

Поэтому и говориться о версии 0 - до выпуска «внешним» клиентам. Потом, когда от твоего API уже кто-то зависит, @Deprecated становится единственным выходом, но не раньше же.

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.