Ruby/Идеология: различия между версиями

Содержимое удалено Содержимое добавлено
Метка: possible spambot (testing)
Строка 255:
 
===Контроль типов через расширение класса===
Очень часто приходится слышать, что "Ruby — нетипизирован". Это очень распространенное заблуждение основано на том, что все переменные в Ruby имеют одинаковый тип: <code>Object</code>. По существу, это означает отключение контроля типов, а не отсутствие типизации. Ruby, по прежнему, остается строготипизированным языком программирования. В виду засилия различных [[w:Си (язык программирования)|Си]]-подобных языков программирования, у многих программистов укоренился в сознании тот факт, что типизация переменных — неотъемлемая часть типизации вообще. Догадаться о том, что именно значение, а не переменная определяют тип, многим не судьба. К тому же, многие даже не догадываются о том, что программа может быть написана без переменных вообще.
 
Вот именно отсутствие контроля за типом переменной и открывает перед программистом богатые возможности. Ведь не нужно плодить шаблоны{{ref|Shablons}}, достаточно написать абстрактный код с переменными, значение и тип которых будут понятны позже. Ведь, программист с самого начала мало представляет облик будущей программы. Это лишь с опытом приходит способность моделировать полностью фукциональный код еще до его написания. А по молодости лет приходится пробовать и ошибаться. Необходимость же контролировать еще и типы переменных, вносит еще большую неразбериху в процесс программирования. Устранив обязательный контроль типов переменных, можно существенно упростить жизнь программисту и повысить скорость написания кода.
 
В Ruby можно определить тип получаемых данных по методам, которые были вызваны для получения этих данных. Например, метод <code>.join</code> со 100% вероятностью формирует объект класса <code>String</code> (строка), а методы <code>.scan</code> и <code>.split</code> — объект типа <code>Array</code> (массив). Но это не всегда работает, так как есть методы, которые есть у нескольких классов и, в зависимости от класса, они возвращают объект того или иного класса. Не могу привести пример таких методов, но вполне допускаю, что они могут быть{{ref|Research}}. Контроль за классом объекта, через вызываемые от него методы, в Ruby называется "Утиным контролем типов". "Утиный" потому, что если объект "крякает как утка, то он и является уткой!". Иными словами, если методы, которые мы хотим вызвать, успешно вызвались, то класс исходного объекта не важен. Остается подобрать такую последовательность методов, которая дает верный результат. О томТо, насколько просто или сложно это реализовать — вопрос отдельный. Могу лишь поделиться своим наблюдением, что первым в последовательности методов ставят метод-адаптер, который конвертирует объект в необходимый для второго метода класс. А дальше все проходит по заведомо определенному маршруту преобразований.
 
Контролировать тип входных данных, которые передаются в метод, можно по -разному. Например, вызывая метод <code>.class</code>, который возвращает класс, к которому принадлежит передаваемый объект.
 
<code>def meTog( napameTp_1 )
Строка 275:
{{info|Метод <code>.class</code> возвращает объект класса <code>Class</code>, то есть код <code><nowiki>o6bekT.class.class == Class</nowiki></code> будет всегда возвращать <code>true</code>}}
 
Обратите внимание на то, что <code>napameTp_1</code> может принадлежать к двум разным классам: <code>String</code> и <code>Array</code>. Это как раз то самое, преимущество, которое появилось благодаря отмене обязательного контроля типов переменных. Во время обязательного конроляконтроля за типом переменной мы обязаны указывать ее тип (и только один). Уж позже придумали плодить иерархию классов лишь для того, чтобы иметь возможность точно такого же контроля.
 
Но все равно, предыдущий код "кривой", так как придется писать отдельный код (внутри метода) для обработки данных класса <code>String</code> и <code>Array</code>. А чем меньше{{ref|Code}} метод, тем лучше. Правильней было бы использовать такую возможность Ruby, как расширение класса.