Осторожней с разработчиками ПО
Внимание автора привлекли маленькие такие картиночки на полях редактора исходного кода в интегрированной среде разработки Visual Studio компании Microsoft, когда в нём открыт файл интерфейса. Это такие синенькие квадратики с вертикальной стрелочкой. Если навести на них курсор мыши, то появится всплывающая подсказка: «Этот метод унаследован». Вот тут-то автора скрутило, ведь это совершенно неправильное утверждение! Методы интерфейсов можно только определять в классе, следующем интерфейсу, но никак не наследовать от него. Казалось бы, крупнейший в мире производитель средств разработки должен знать лучше.
Пришлось начать разбираться, что происходит, и оказалось, что не понимают смысла следования интерфейсу почти все работники сферы ИТ, кто имеют заметное присутствие в Интернет: в блогах, соцсетях и т.п. Это включает популярный сайт W3 Schools, по которому учатся многие начинающие разработчики. Он утверждает: «Интерфейс — это полностью абстрактный класс». Какая дичайшая чушь! Или этот сайт изначально занимается подрывной деятельностью против человечества, или неграмотный автор заблуждается, но этого никто не заметил. Оба варианта одинаково ужасны.
Вопрос, чем отличается абстрактный класс от интерфейса, каждый год задают на собеседованиях миллионам кандидатов на должность разработчика ПО. По-видимому, большинство отвечает на него неправильно, и так же по-видимому это устраивает большинство нанимателей. Это тихий ужас, потому что в индустрии ИТ, оказывается, работают десятки миллионов некомпетентных сотрудников.
Абстрактный класс — это выкройка или чертёж. Люди не носят выкройки: они носят одежду, скроенную по выкройкам. Люди не живут и не ездят в чертежах: они живут в домах и ездят в автомобилях и поездах, построенных по чертежам. Точно так же, абстрактный класс является шаблоном для создания реальных объектов, порождённых от него.
Интерфейс — это лишь каталог. Люди не пользуются каталогами. Они пользуются товарами, которые заказывают из них. Точно так же, интерфейс используется, чтобы узнать, какие функции содержатся в классе, который следует интерфейсу.
Создать экземпляр интерфейса невозможно. Можно только создать экземпляр класса, следующего интерфейсу. Точно так же, можно обращаться к уже существующим экземплярам классов при помощи интерфейса. Заказать можно лишь объект конкретного класса, у которого есть указанные в интерфейсе методы. Поэтому интерфейс иногда называют договором: он определяет, что с этим объектом можно делать.
Каковы последствия незнания или недопонимания этих понятий? Это, конечно же, неправильный программный код, содержащийся в ПО, которым всё человечество пользуется. Одним из ярчайших примеров является возвращаемое значение, объявленное интерфейсом, а не конкретным классом, когда функция знает, что она возвращает. Да, встречаются ситуации, когда это точно неизвестно, и тогда выхода нет. Но если это известно, то возвращать интерфейс нет смысла. Другое дело — параметры функции. Тут интерфейсы полезны, потому что позволяют абстрагироваться от конкретного класса и написать более гибкий код. Общее правило простое: знаешь, с чем имеешь дело? Используй конкретный класс. Не знаешь? Используй интерфейс. В чём разница? Ничто не бывает бесплатным, особенно хорошее и удобное. Производительность может быть существенно ниже при использовании интерфейса. Это все мы наблюдаем повсеместно, о чём автор уже упоминал в предыдущих статьях цикла.
Как так получилось? Или знающих профессионалов просто нет, или они намеренно врут, или почему-то молчат. Первое сомнительно, второе маловероятно, третье весьма возможно. Враньё чревато разоблачением. Знающим невыгодно поправлять незнающих. Зачем плодить себе конкурентов? И вот так мощность целых электростанций тратится сначала на написание, а затем на выполнение медленного программного кода, тогда как цены на энергоресурсы высоки и продолжают расти, а ради обладания ими летят ракеты и взрываются бомбы. Оказывается, разработчики ПО тоже к этому причастны.
Свидетельство о публикации №226081801749