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