В Java и C # существует ряд соглашений, с которыми мы привыкли;но это назад.Например, соглашение о размещении частных переменных в начале каждого класса довольно глупо с технической точки зрения.Самое важное в классе - это публичные методы. минимум важных вещей, вещи, которые мы скрываем за барьером конфиденциальности, являются переменными экземпляра.Так зачем нам ставить их сверху?
"I" перед интерфейсами - это еще одно обратное соглашение.Когда вам передают ссылку на объект, вы должны ожидать , что это будет интерфейс.Интерфейсы должны быть по умолчанию;поэтому нет смысла делать что-то дополнительное, например, используя префикс I, чтобы объявить, что вы делаете то, что от вас ожидают все.Было бы лучше (хотя все еще неправильно), если бы мы зарезервировали специальный маркер для условия исключительный для передачи конкретного класса.
Другая проблема с использованием I заключается в том, что (как ни странно) мы используемэто для передачи решения о реализации использования интерфейса.Обычно мы не хотим, чтобы решения по реализации выражались так громко, потому что это затрудняет их изменение.Рассмотрим, например, что может произойти, если вы решили, что IFoo действительно должен быть абстрактным классом, а не интерфейсом.Если вы поменяете имя на Foo или CFoo, или ACFoo?
Я слышу, как вращаются колеса в вашей голове.Вы думаете: «Да, но интерфейсы занимают особое место в языке, и поэтому разумно отметить их специальным соглашением об именах».Это правда.Но целые числа также занимают особое место в языке, и мы их больше не помечаем.Кроме того, спросите себя: почему занимают ли интерфейсы особое место в языке?
Вся идея интерфейсов в Java и C # была неудачной.Разработчики языка могли бы только что использовать абстрактные классы, но их беспокоили трудности реализации множественного наследования.Таким образом, они заключили сделку с самим собой.Они изобрели искусственную конструкцию (то есть интерфейсы), которая обеспечивала бы некоторую мощность множественного наследования, и они ограничивали нормальные классы одиночным наследованием.
Это было одно из худших решений языкадизайнеры сделали.Они изобрели новый и тяжелый синтаксический элемент, чтобы исключить полезную и мощную (хотя и противоречивую) языковую функцию.Интерфейсы не были изобретены для включения, они были изобретены для отключения .Интерфейсы - это взломанный язык, созданный дизайнерами, которые не хотели решать более сложную проблему MI.Поэтому, когда вы используете префикс I, вы уделяете большое внимание одному из крупнейших хаков в истории языков.
В следующий раз, когда вы напишите сигнатуру функции, подобную этой:
public void myFunction(IFoo foo) {...}
Спросите себя: «Почему я хочу знать, что автор IFoo использовал слово« интерфейс »? Какая разница для меня, использовал ли он« интерфейс »или« класс »или даже« struct »? его дело, а не мое! Так почему же он заставляет меня узнать свое дело, поставив этого великого «я» перед своим типичным именем? Почему он не застегивает свои заявления и не скрывает своих рядовых от моего лица?"