Я щойно прочитав одну із статей Джоеля, в якій він говорить:
Взагалі, я повинен визнати, що я трохи боюся мовних особливостей, які приховують речі . Коли ви бачите код
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
, але те, що він насправді робить, є абсолютно незрозумілим і неінтуїтивним і не має нічого спільного з множенням речей". Це сценарій, який ми повинні враховувати при розробці мови програмування? Тоді нам доведеться відмовитися від ідентифікаторів з мов програмування на тій підставі, що вони можуть вводити в оману!
Якщо ви хочете знати, що робить метод, ви можете або переглянути документацію, або зазирнути всередину реалізації. Перевантаження оператора - це лише синтаксичний цукор, і я не бачу, як це взагалі змінює гру.
Будь ласка, просвіти мене.