Ruby/Идеология: различия между версиями
Содержимое удалено Содержимое добавлено
Строка 479:
Очень часто приходится слышать, что "Ruby — нетипизирован". Это очень распространенное заблуждение основано на том, что все переменные в Ruby имеют одинаковый тип: <code>Object</code>. По существу, это означает отключение контроля типов, а не отсутствие типизации. Ruby, по прежнему, остается строготипизированным языком программирования. В виду засилия различных [[w:Си (язык программирования)|Си]]-подобных языков программирования, у многих программистов укоренился в сознании тот факт, что типизация переменных — неотъемлемая часть типизации вообще. Догадаться о том, что именно значение, а не переменная определяют тип, многим не судьба. К тому же, многие даже не догадываются о том, что программа может быть написана без переменных вообще.
Вот именно отсутствие контроля за типом переменной и открывает перед программистом богатые возможности. Ведь не нужно плодить шаблоны
В Ruby можно определить тип получаемых данных по методам, которые были вызваны для получения этих данных. Например, метод <code>.join</code> со 100% вероятностью формирует объект класса <code>String</code> (строка), а методы <code>.scan</code> и <code>.split</code> — объект типа <code>Array</code> (массив). Но это не всегда работает, так как есть методы, которые есть у нескольких классов и, в зависимости от класса, они возвращают объект того или иного класса. Не могу привести пример таких методов, но вполне допускаю, что они могут быть
Контролировать тип входных данных, которые передаются в метод можно по разному. Например, вызывая метод <code>.class</code>, который возвращает класс, к которому принадлежит передаваемый объект.
Строка 499:
Обратите внимание на то, что <code>napameTp_1</code> может принадлежать к двум разным классам: <code>String</code> и <code>Array</code>. Это как раз то самое, преимущество, которое появилось благодаря отмене обязательного контроля типов переменных. Во время обязательного конроля за типом переменной мы обязаны указывать ее тип (и только один). Уж позже придумали плодить иерархию классов лишь для того, чтобы иметь возможность точно такого же контроля.
Но все равно, предыдущий код "кривой", так как придется писать отдельный код (внутри метода) для обработки данных класса <code>String</code> и <code>Array</code>. А чем меньше{{ref|Code}} метод, тем лучше
{{info|Расширение класса — это механизм, который позволяет динамически добавить или переопределить метод. Это новое [[w:Объектно-ориентированное программирование|ООП]]-понятие, которое
Давайте реализуем предыдущий код, но с использованием расширения класса.
Строка 520:
В зависимости от класса, будет вызван либо один <code>meTog</code>, либо другой. При этом, <code>meTog</code> в классе <code>String</code> используется как адаптер для <code>meTog</code>а класса <code>Array</code>. Единственный недостаток такого подхода — случайное переопределение базовых методов. Но эта случайность быстро отлавливается.
----
{{Note|Shablons}} — Cуществование шаблонов в языках [[w:C++|C++]] и [[w:C_Sharp|C#]] наглядно показывает, что профессиональным программистам мешает излишне строгий контроль типов.
{{Note|Research}} — Подробное исследование мной пока не проводилось, но в ближайшее время оно будет проведено и опубликовано отдельной статьей.
{{Note|Code}} — Имеется в виду размер кода.
|