Javanese Online

Интерфейс с единственной реализацией

В книгах по объектно-ориентированному проектированию я не встречал подходящего словосочетания, которое обозначило бы данное явление. Поэтому назову его Monomorphic Interface или Single Implementation Interface — интерфейс с единственной реализацией. Разберём ситуации, в которых такое возникает, а также предпосылки и последствия.

Именование

Имя интерфейса должно отражать абстрактную идею; имена реализаций — как именно работает данный класс. Например: AppendableCharArrayWriter, CharBuffer, FileWriter, PrintStream, StringBuffer, StringBuilder; CharSequenceCharBuffer, String, StringBuffer, StringBuilder; AsynchronousChannelAsynchronousFileChannel, AsynchronousServerSocketChannel, AsynchronousSocketChannel; SetArraySet, CopyOnWriteArraySet, EnumSet, HashSet, LinkedHashSet.

Имя не должно кричать «Смотрите, это интерфейс!», как, например, IService, или «Да это ж реализация!» как ServiceImpl. Привычка заводить интерфейсы без надобности и столь бессмысленно именовать их приводит к мусору в коде, понимать и поддерживать который сложнее.

Комментарии к уроку
{"type":"lessonComments","id":"47b767aa-4903-4441-8e4e-24a41668d0a1","comments":[{"id":"c90b5faa-fcac-4c7b-8c56-daa1511d0be8","authorSrc":"Vk","authorId":"whalemare","text":"А как именовать реализацию интерфейса, кроме как InterfaceImpl, если другие его реализации используются только в тестах?","added":1541560080000,"answers":[{"id":"e91e6361-1049-4d8e-b5dc-18497cee64d1","authorSrc":"GitHub","authorId":"Miha-x64","text":"Когда мне нужно было спрятать реализацию, выставив только интерфейс, я [назвал класс с приставкой Real](https://github.com/Miha-x64/reactive-properties/blob/55264b825e72839184ff83ba71175eaf946ecf08/sql/src/main/kotlin/net/aquadc/properties/sql/RealTransaction.kt#L11), [как это принято в Square](https://github.com/square/okhttp/blob/5c0591b13559565de42bbb845519438adec6395b/okhttp/src/main/java/okhttp3/RealCall.java#L40). Вероятно, просто потому что не люблю `Impl` за запах энтерпрайза.\n\nНо умом я, конечно, понимаю, что решающей разницы междй `Real*` и `*Impl` нет.","added":1547314036987,"answers":[]}]}]}

Сообщить об ошибке

Javanese.Online в GitHub

Чаты и каналы в Telegram

RSS-лента