?

Log in

No account? Create an account
 
 
01 October 2009 @ 09:44 am
Записки программиста.  
Hungarian Notation

[Отвечаю на Фимин вопрос к предидущему посту: "Пап, а что ты имеешь против Hungarian notation, просто интересно..."]



Да не то чтобы против - просто это плохо совместимо как с современными языками, так и с современными принципами программирования.

Пришло это из очень давних времен, когда основным инструментом были ассемблеры или другие языка без (или почти без) контроля типов. И - делать информацию о типе (как то, целое, плавающее и.т.д.) частью имени было остроумным способом контролировать тип полу-вручную. Скажем, переменная "weight" целочисленная; определим ее как "int_wait". Тогда, если я (или кто-то) будет ошибочно думать, что она плавающая, то напишет "float_waight" и ассемблер/компайлер немедленно схватит за руку: уж использование то неопределенных имен все ловят (впрочем, кроме фортрана).

Мне это, правда, никогда не нравилось: раздутые длинные имена переменных делали программу трудной и для написания и для чтения/понимания.

Но, другой серьезный недостаток этого класса именований состоит в том, что он противоречит одному из самых мощьных принципов - абстрагированию.
Представим себе, что нам нужно написать код для решения системы линейных уравнений, скажем, одну
из разновидностей метода Гаусса. Использование чего-то вроде HN приведет нас к тому, что мы будем думать,
с какими числами мы работаем - целыми, плавающими или еще какими. И мы напишем, скажем, программу
решающую систему уравнений с плавающими коэфициентами.

А вообще-то алгоритм от этого не зависит. Может, только зависит слегка, если мы знаем, что ьы имеем дело с полем
или кольцом. И, если имена не привязаны к типам, мы можем написать универсальный код. Он бедет правильно работать для любых чисел: плавающих, с большой точностью, комплексных. А если мы не считали, что нам нужно поле,
то и с целыми числами и даже многочленами!

Практически все современные языки для встроенных типов такой код примут. А в языках с поддержкой абстрактных типов данных - как С++ (кажется, это началось с Simula-67), мы можем без труда описать тип "многочнены от
одной переменной" или даже "многочнены от одной переменной над полем вычетов по модулю 2". И наш код будет
так же хорошо работать.

Замечу, что здесь главным является не только (а может и не столько) возможность написать более универсальный код, а еще и разбиение праблемы на две части, абстрагирующиеся дрег от дрега. В случае чисел это тривиально, а вот в случае многочленов, проблемы решения уравнений и операций с многчленами (да и опрераций с числами) совершенно независимы: нужно только знать, что, скажем, уравнения имеют дело с кольцом, а кольцо многочленов должно быть над полем.
И это позволяет применять принцип "разделяй и властвуй" - решить отдельно две небольшие проблемы всегда проще чем одну комбинированную большую. И трудность растет обычно нелинейно - не зря разделение задачи на мало зависимые, более абстрактные компоненты, часто бывает очень непростой (часто, главной) задачей создания прграммного обеспечения.

Но, впрочем, абстракции абстракциями, а скажем отличать параметры функций от других переменных я люблю -
обычно в имена параметров я добавляю подчеркивание в конец.

Еще распространено синтаксически различать этементы текущего объекта (this - я о C++, конечно) от локальных переменных - что-нибудь вроде префикса "m_" . Но я
это не люблю, потому что это нагружает использованием того-же ненужного префикса в случаях, когдо объект или пойнтер явно указаны. Уж лучше было бы форсировать написание "this->name", как это и сделано в некоторых более современных чем С++ языках.



 
 
 
Фурман. Леша Фурманthe_furman on October 1st, 2009 05:28 pm (UTC)
для меня по крайней мере, проблема отличия переменных текущего объекта от всего остального давно решена на уровне IDE, и все эти "м_" и так далее меня безумно раздражают т.к. они убивают читаемость кода, как, собственно, и hungarian notation.
Fima F.wet_kimono on October 1st, 2009 07:04 pm (UTC)
в IDE да, но когда код напечатан, то не всегда. Потом ты привык к хорошим IDE Java/.NET, а мне часто приходится работать с чем-то попроще. Я согласен, что Hungarian notation совершенно необязателен, но вижу я его много, и мне несколько проще читать код, особенно напечатанный, когда я знаю посмотрев на название переменной, с чем имею дело.
Misha Furmanmishafurman on October 2nd, 2009 12:24 am (UTC)
Вообще-то то что я пыталска сказать, что эта информация "с чем имею дело" вообще-то не нужна, а часто вредна. Она:
- замусоривает код
- делает его излишне специализированным
- мешает в кучу разные уровни и модули абстракции.

Если ты делаешь сложения с умножениями, то тебе как правило нужно только знать что переменные - элементы кольца. Может еще, коммутативного или нет (впрочем, некомутативные в форме простых переменных (объектов) используются нечасто.

Как я уже сказал, единственное, что, может, в С++ плохо синтаксически различимо (касающееся переменных) - это
current object members - я обычно приспосадливаюсь (параметры - выделяю, а локалы - их немного и имена обычно короткие), но я бы предпочел форсировать
нотацию this->member, если проблемы: скажем еае в Pithone, если память мне не изменяет - self.member.

Остальное же - тольо зло.
Fima F.wet_kimono on October 2nd, 2009 12:54 pm (UTC)
Я, мне кажется, понимаю, о чем-ты, но уменя нет твердого мнения на эту тему. В результате я обычно следую принятому порядку вещей, так-как если один и тот-же модуль написан по-разному, то это приносит дополнительную путаницу. Про object members тоже согласен, по крайней мере когда нет какого-то определяющего паттерна, то код читается с большим трудом.
Абу Антосьsyarzhuk on October 8th, 2009 02:45 pm (UTC)
Я как-то читал интервью самого Simonyi, он объяснял, что его исходная идея была вовсе не тянуть компьютерный тип данных (lpsz, ага), а СМЫСЛ того, что в переменной содержится. Например, могут быть три переменные, все float, но две из них означают ширину и высоту, т.е. размерность в метрах, а третья - площадь, т.е. в метрах квадратных. Вот тут-то он и использовал префиксы, тогда сразу можно было отловить взглядом, где переменные используются неправильно
Misha Furmanmishafurman on October 8th, 2009 05:23 pm (UTC)
Я уже начал было отвечать на Ваш комментарий, но тут обнаружил, что потратил на это уже 20 минут рабочего времени - и далек от завершения. Так что я постараюсь прокомментировать Ваше мнение на днях, в отдельной заметке.


Edited at 2009-10-08 05:23 pm (UTC)
Misha Furmanmishafurman on October 9th, 2009 05:27 pm (UTC)
Комментарий