Я только что прочитал одну из статей Джоэла, в которых он говорит:
В общем, я должен признать, что я немного боюсь языковых особенностей, которые скрывают вещи . Когда вы видите код
i = j * 5;
… В C вы знаете, по крайней мере, что j умножается на пять, а результаты сохраняются в i.
Но если вы видите тот же фрагмент кода на C ++, вы ничего не знаете. Ничего. Единственный способ узнать, что в действительности происходит в C ++, - это выяснить, что такое типы i и j, что может быть объявлено где-то еще. Это потому, что j может иметь тип, который
operator*
перегружен, и он делает что-то очень остроумное, когда вы пытаетесь его умножить.
(Акцент мой.) Боишься языковых особенностей, которые скрывают вещи? Как ты можешь бояться этого? Разве сокрытие вещей (также известное как абстракция ) не является одной из ключевых идей объектно-ориентированного программирования? Каждый раз, когда вы вызываете метод a.foo(b)
, вы не представляете, что это может сделать. Вы должны выяснить, что это за типы a
и b
что, что может быть объявлено где-то еще. Так стоит ли нам отказываться от объектно-ориентированного программирования, потому что оно слишком много скрывает от программиста?
И чем это j * 5
отличается от того j.multiply(5)
, что вам, возможно, придется написать на языке, который не поддерживает перегрузку операторов? Опять же, вам придется выяснить тип j
и заглянуть внутрь multiply
метода, потому что вот, j
может быть, это тот тип, у которого есть multiply
метод, который делает что-то ужасно остроумное.
«Муахаха, я злой программист, который называет метод multiply
, но на самом деле он абсолютно неясен и не интуитивен, и ему абсолютно нечего делать с умножением». Это сценарий, который мы должны учитывать при разработке языка программирования? Тогда мы должны отказаться от идентификаторов из языков программирования на том основании, что они могут вводить в заблуждение!
Если вы хотите узнать, что делает метод, вы можете взглянуть на документацию или заглянуть внутрь реализации. Перегрузка операторов - просто синтаксический сахар, и я не вижу, как это вообще меняет игру.
Пожалуйста, просветите меня.