Re[30]: Мэйнстрим vs. Самосовершенствование :)))
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.11.04 02:10
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>В последнем процитированном сообщении,


Процетирую последнюю ссылку:

VD>Не не въехал! Там же нет префикса std::, а это теперь считается неграмотным. И вообще, если все методы (пусть и статические) помещать в класс к которому они относятся, то любой дурак нажав точку в IDE получит их список. А это уже покушение на место проффесиональных программистов! Ведь раньше только они знали где отрыть нужный метод! Вот как по-твоему найти метод бинарного поиска в СТЛ? Аа... слабо?! (зларадно) А вот Паша уже знает. И он нам свое место не за что не уступит.


В ней только стеб над твоей любовью к std:: и нежелаение признавать, что и по другому можно. Призывов делать только так как сделано в Яве и дотнете нет. В прочем как и их упоминания.

ПК>и далее по ветке. При этом постоянно поминая инкапсуляцию:

ПК>

ПК>По теории ООП все методы объекта желательно помещать в его класс. Ну, а как они там внутри реализованы... дык на то есть инкапсуляция.


И здесь не вижу.

ПК>и обвиняя оппонента в "детских ошибках".


Не обвинение, а констатация факта.

>> Может быть просто признать тот факт, что это ты пыташся выдать свое мнение за единстванно верное и тем самым навязать его, а я все го лишь говорю, что считаю иначе?


ПК>Какое именно мое мнение?


О том что все не приметивные методы нужно делать глобальными функциями. И наезды на статические методы Sort в Яве.

ПК> Ты опять пропустил, что началось все с того, что ты зачем-то приплел в разговор размещение sort() и т.п. "в классе, к которому они относятся", хотя речь шла совершенно о другом. Как я мог навязывать кому-то свое мнение, если я до твоего высказывания даже не упоминал?


Нда. Связь с реалией снова потерен. Вот сообщение
Автор: Павел Кузнецов
Дата: 28.10.04
в котором ты ты приплел Явовский класс со списком исключительно статических методов (гы-гы) и начал изливаться про инварианты. А вот здесь ты как раз преплел методы sort из этого многострадального класса.

Далее тебе кто-то замети, что методы статические, но тебя было уже не остановить. Ты и это как-то обосновал. Хотя как в Яве могут быть методы не экземплярные и не статические одновременно?

Далее ты много раз говори о вреде метода Sort в массиве. Но так и не продемонстрировал ни разу этого вреда. Вот хотлось бы заполучить хоть одну ссылку случая когда кто-нибудь от этого пострадал.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[31]: Мэйнстрим vs. Самосовершенствование :)))
От: Павел Кузнецов  
Дата: 02.11.04 04:36
Оценка: +2
VladD2:

> Процетирую последнюю ссылку: <...> В ней только стеб над твоей любовью к std:: и нежелаение признавать, что и по другому можно. Призывов делать только так как сделано в Яве и дотнете нет. В прочем как и их упоминания.


1) Я не упоминал STL.
2) Я вполне согласен, что можно делать по-другому. Также я понимаю и недостатки делания "по-другому" (впрочем, равно как и достоинства). Именно поэтому в первом сообщении я сказал, что вопрос это спорный.
3) В Java сделано не так, как в .Net. А именно, в Java, как уже много раз было указано, функция sort() вместе с остальными утилитами типа binarySearch(), fill() и т.п. вынесена в "namespace" java.util.Arrays, который сделан классом только из-за невозможности иметь в Java "свободные" функции. Так что, если уж поминать STL, то в этом отношении в Java сделано скорее ближе к тому, как в STL, чем к тому, как в .Net

>>> Может быть просто признать тот факт, что это ты пыташся выдать свое мнение за единстванно верное и тем самым навязать его, а я все го лишь говорю, что считаю иначе?


> ПК>Какое именно мое мнение?


> О том что все не приметивные методы нужно делать глобальными функциями.


Нет у меня такого мнения. Сложность метода никакого отношения к тому, делать ли его членом или нет, с моей точки зрения, не имеет. Для меня основное — степень его отношения к основной задаче, выполняемой классом.

> И наезды на статические методы Sort в Яве.


sort() в Java является статической функцией отдельного "класса" java.util.Arrays, не Array. Сделан он классом чисто номинально, т.к. "свободных" функций в Java нет. Никаких претензий или наездов на библиотеку Java по этому поводу у меня нет. Единственное, на что я обратил внимание, так это на то, что авторам библиотеки пришлось имитировать namespace с помощью класса из-за своеобразности языка. Об этом же, насколько я его понял, говорил и INTP_mihoshi. Синклер попросил пример — ему его привели. Точка.

Вся дальнейшая дискуссия — результат твоих реплик по совершенно другой теме, а именно предпочтению тобой размещения sort() "в самом классе, к которому она относится", "чтобы IDE показывала список методов при нажатии на точку".

> ПК> Ты опять пропустил, что началось все с того, что ты зачем-то приплел в разговор размещение sort() и т.п. "в классе, к которому они относятся", хотя речь шла совершенно о другом. Как я мог навязывать кому-то свое мнение, если я до твоего высказывания даже не упоминал?


> Нда. Связь с реалией снова потерен.


Очень похоже на то.

> Вот сообщение
Автор: Павел Кузнецов
Дата: 28.10.04
в котором ты ты приплел Явовский класс со списком исключительно статических методов (гы-гы) и начал изливаться про инварианты. А вот здесь ты как раз преплел методы sort из этого многострадального класса.


И? Как это все относится к тому, помещать ли функцию sort() в класс Array?

> Далее тебе кто-то замети, что методы статические, но тебя было уже не остановить. Ты и это как-то обосновал.


Я более чем был в курсе, что в указанном классе методы исключительно статические. В этом был весь смысл приведения мной этого примера.

> Хотя как в Яве могут быть методы не экземплярные и не статические одновременно?


Елки-палки, лес густой Я именно об этом вместе с INTP_mihoshi и говорил, что в Java нет "свободных" функций, и поэтому приходится создавать "липовые" "классы" вместо namespace. Никаких претензий к дизайну библиотеки Java в этом отношении у меня нет и не было: разработчики сделали лучшее, что позволил им язык.

Чтобы тебе было окончательно ясно, вот ссылка
Автор: Павел Кузнецов
Дата: 29.10.04
на мое первое к тебе сообщение, в котором я, на мой взгляд, вполне ясно говорю о том, что твои претензии совершенно не по адресу, и что положение функции sort() вопрос абсолютно отдельный, не связанный с тем примером, который я привел.

P.S. Честно говоря, я уже окончательно потерял надежду что-то тебе объяснить. Сам не знаю, зачем я это сообщение написал, ибо, думаю, абсолютно бесполезно это...
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[31]: Мэйнстрим vs. Самосовершенствование :)))
От: Павел Кузнецов  
Дата: 02.11.04 05:00
Оценка: 6 (1) +1
VladD2:

> Скорее всего тут проблемы в понимании приципов ООП.


No comment.

> Мыслить от "утилиты"/"сотелиты" вообще вредно. Сделай декомпозицию на уровне классов и скорее всего окажется, что функция является методом некоторого другого класса.


Хорошо. Вот несколько примеров. Очень интересно, в соответствии с "правильным мышлением", методами какого класса являются указанные функции, и почему (если на все "правильно мысля" ответить трудно, то хотя бы на самый последний)... Очень интересно при этом также узнать, как принятые решения будут влиять на такую метрику качества ОО дизайна, как зависимости между классами

  • Есть два класса: Date и String. Методом какого класса является функции: 1) преобразования даты в строку; 2) преобразования строки в дату?

  • Методом какого класса является функции преобразования: 1) целого в строку; 2) строки в целое? Есть ли какое-либо отличие этого примера от предыдущего?

  • Есть два класса: Date и DateDifference. Методом какого класса являются функции: суммы/разницы двух дат, суммы/разницы двух DateDifference, суммы Date и DateDifference?

  • Есть классы: Matrix и Vector. Методами какого класса являются функции: 1) умножения матрицы на вектор (результат — матрица); 2) умножения двух векторов по схеме "строка на столбец" (результат — матрица); 3) скалярного умножения векторов (результат — число); 4) афинных трансформаций вектора в соответствии с заданной матрицей преобразования?

    И, наконец:

  • Есть классы, контролирующие размерность: Velocity (v, скорость), Acceleration (a, ускорение), Length (l, длина), Time (t, время). Методами каких классов являются функции, соответствующие следущим выражениям: 1) l = v * t; 2) v = l / t; 3) v2 = v * v; 4) a = v / t; 5) v = a * t; 6) t2 = t * t; 6) l = 1 / 2 * a * t * t
    Posted via RSDN NNTP Server 1.9 gamma
  • Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[27]: Мэйнстрим vs. Самосовершенствование :)))
    От: Павел Кузнецов  
    Дата: 02.11.04 05:07
    Оценка: 6 (1) +1
    VladD2:

    > ПК> Дык, я ж тебе привел названия классических критериев. Тебе достаточно просто погуглить по этим названиям.


    > Мне то зачем? Ты что-то хочешь доказать. Вот и гугли.


    Я? Кому? Тебе, что ли? Это абсолютно бесперспективное занятие без твоего желания что-то узнать. Ты задавал вопросы, я на них отвечал. Не надо — отлично, разговор окончен. В следующий раз здорово сэкономишь нам обоим время, если больше вопросов, на которые тебе не нужны ответы, задавать не будешь.
    Posted via RSDN NNTP Server 1.9 gamma
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[28]: Мэйнстрим vs. Самосовершенствование :)))
    От: Павел Кузнецов  
    Дата: 02.11.04 05:50
    Оценка:
    Undying,

    >> Не понял в чем проблема и зачем с ними по разному работать? Естественно у обертки есть конструктор принимающий ArrayList, соответственно преобразование в обертку производится одной строчкой: new Wrapper(arrayList).


    > Ок, я почему-то представил себе ситуацию, когда для получения Wrapper нужно скопировать в него содержимое ArrayList.


    P.S. Но одна проблема с обертками, раз имеется в виду не наследование, все-таки, есть: если язык не поддерживает автоматическое делегирование (*), то каждый раз, когда в Array будет добавляться новый метод, надо будет модифицировать Wrapper.

    Ситуация еще осложнится, если между нашим Wrapper'ом, и Array будет еще один-два слоя "библиотечных" оберток Wrapper1, Wrapper2 etc., добавляющих дополнительные, нужные нам "утилиты". Эти обертки неизбежно будут "запаздывать" за расширением Array, и в результате, если они не "выдают" Array наружу (**), наш Wrapper утилитами, добавленными в Array, пользоваться не сможет.




    (*) Насколько я представляю, большинство статически типизированных языков этого не умеют. Впрочем, я знаком только с более-менее практически использующимися статически типизированными языками, поддерживающими ООП, и не со всеми одинаково хорошо, так что тут могу легко заблуждаться.

    (**) Что, со строгой точки зрения, если бы обертки были бы "полноценными" классами, уж точно являлось бы нарушением инкапсуляции, с которым, впрочем, при таком дизайне, наверное, приходится мириться Правда, с другой стороны, обертки "полноценными" классами, наверное, не являются в том смысле, что никакие новые сущности они собой не олицетворяют, и инварианты их, по идее, совпадают с инвариантами Array, так что, наверное, применительно к ним о нарушении инкапсуляции, вообще, говорить бесмысленно, т.к. они по сути ничего и не инкапсулируют... Или нет? По-моему, обертки, предназначенные только для добавления вспомогательных функций, и выдающие свои "потроха" наружу, в классическое ООП вообще слабо вписываются...
    Posted via RSDN NNTP Server 1.9 gamma
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[13]: Мэйнстрим vs. Самосовершенствование :)))
    От: Sinclair Россия http://corp.ingrammicro.com/Solutions/Cloud.aspx
    Дата: 02.11.04 06:06
    Оценка: 43 (2) +2
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Например, я не вполне понимаю, зачем обобщенные алгоритмы типа сортировки делать методами классов Вот пример такого, с позволения сказать, класса: http://java.sun.com/j2se/1.4.2/docs/api/java/util/Arrays.html — ни состояния, ни поведения, ни инвариантов

    Что-то я подзапустил дискуссию.
    В общем, мое понимание этого таково: твой поинт в том, что существуют некоторые алгоритмы, которые никак не относятся к конкретному объекту, а скорее "плавают в воздухе".
    Современные ОО-системы позволяют реализовывать безконтекстные методы, однако они выглядят достаточно искусственными. Влад считает, что этим методам самое место в тех классах, к которым методы имеют какое-то отношение. Авторы джавы считают, что утилитные классы — это удобно, а словосочетания "концепции ООП" и "вопиющее нарушение" считают уделом эстетов.


    Давайте разберемся. Во-первых, речь идет о как минимум двух разных явлениях. Первое — использование класса в качестве неймспейса для утилитных процедур. Второе — помещение в класс утилитных методов.

    По поводу свободных процедур у меня возникают некоторые сомнения. Дело в том, что с точки зрения ООП все должно быть объектом. Я бы выделил методы типа Sort в специальные объекты, реализующие некоторые алгоритмы. Примерно так:
    public interface ISort {
      public ISequentiallyAccessibleCollection Sort(IArbitraryAccessCollection source);
    }

    Таким образом, мы изолировали требования к алгоритму от его реализации. Теперь мы можем предоставлять пользователю классы алгоритмов, которые возможно требуют дополнительной инициализации:
    public class HeapSort: ISort {
      public HeapSort(); // инициализация не нужна
      public ISequentiallyAccessibleCollection Sort(IArbitraryAccessCollection source);
    }
    public class QuickSort: ISort  {
      public QuickSort(); // инициализация не нужна
      public ISequentiallyAccessibleCollection Sort(IArbitraryAccessCollection source);
    }

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

    Теперь по поводу размещения утилитных методов. Владу не понравится ни решение с объектами алгоритмов, ни со статик методами утилитных классов. Потому как он хочет объектно-ориентированного интерфейса разработчика, т.е. "тыкая" в объект мы сразу поняли, что с ним можно делать. Либо через броузер, либо code completion... В некоторых случаях это может быть даже оправдано. Ну, вот к примеру наш гипотетический ISort всегда пользуется IArbitraryAccessCollection. Было бы здорово, если бы мы могли как-то найти все эти алгоритмы, глядя на какой-нибудь int a[4000]. Увы, пока что это не представляется возможным. Я вижу два варианта:
    1. Изменить язык и дать возможность вносить фиксированные реализации методов в интерфейсы. Хотя бы статиков. Тогда мы могли бы записать все, что нам нужно, в интерфейс для source, и жить себе не тужить.
    2. Оставить язык в покое и сделать более продвинутый редактор. Например, при помощи атрибутов расширять CodeCompletion. Примерно так:
      public class Algorithms{
      [ExtendCodeCompletionFor(typeof(IArbitraryAccessCollection))]
      public static ISequentiallyAccessibleCollection HeapSort(IArbitraryAccessCollection source);
      [ExtendCodeCompletionFor(typeof(IArbitraryAccessCollection))]
      public static ISequentiallyAccessibleCollection QuickSort(IArbitraryAccessCollection source);
      }
    И когда мы нажимаем Ctrl-Space на b = a, редактор помимо родных методов для int[] высвечивет также и Algorithms.QuickSort и Algorithms.HeapSort. При их выборе в код вставляется соответствующий вызов. В данном случае предложено как раз джаваподобное решение, которое конечно же косяк, но я привел его только для полноты ощущений. Подумав, можно научить редактор жить и с кодом из первой части — когда функциональность реализуют именно объекты.
    ... << RSDN@Home 1.1.4 beta 3 rev. 185>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    http://rsdn.org/File/5743/rsdnaddict.GIF
    Re[32]: Мэйнстрим vs. Самосовершенствование :)))
    От: Sinclair Россия http://corp.ingrammicro.com/Solutions/Cloud.aspx
    Дата: 02.11.04 06:17
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:
    ПК>Хорошо. Вот несколько примеров. Очень интересно, в соответствии с "правильным мышлением", методами какого класса являются указанные функции, и почему (если на все "правильно мысля" ответить трудно, то хотя бы на самый последний)... Очень интересно при этом также узнать, как принятые решения будут влиять на такую метрику качества ОО дизайна, как зависимости между классами

    ПК>
  • Есть два класса: Date и String. Методом какого класса является функции: 1) преобразования даты в строку; 2) преобразования строки в дату?
    DateConverter: TypeConverter.
    ПК>
  • Методом какого класса является функции преобразования: 1) целого в строку; 2) строки в целое? Есть ли какое-либо отличие этого примера от предыдущего?
    IntConverter: TypeConverter.
    ПК>
  • Есть два класса: Date и DateDifference. Методом какого класса являются функции: суммы/разницы двух дат, суммы/разницы двух DateDifference, суммы Date и DateDifference?
    Возможно, Calendar?
    ПК>
  • Есть классы: Matrix и Vector. Методами какого класса являются функции: 1) умножения матрицы на вектор (результат — матрица); 2) умножения двух векторов по схеме "строка на столбец" (результат — матрица); 3) скалярного умножения векторов (результат — число); 4) афинных трансформаций вектора в соответствии с заданной матрицей преобразования?
    Хм. Задумался.
    ПК>И, наконец:

    ПК>
  • Есть классы, контролирующие размерность: Velocity (v, скорость), Acceleration (a, ускорение), Length (l, длина), Time (t, время). Методами каких классов являются функции, соответствующие следущим выражениям: 1) l = v * t; 2) v = l / t; 3) v2 = v * v; 4) a = v / t; 5) v = a * t; 6) t2 = t * t; 6) l = 1 / 2 * a * t * t
    Ну, мы же знаем, где должны определяться операторы
    ... << RSDN@Home 1.1.4 beta 3 rev. 185>>
  • Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    http://rsdn.org/File/5743/rsdnaddict.GIF
    Re[29]: Мэйнстрим vs. Самосовершенствование :)))
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 02.11.04 08:03
    Оценка: 15 (1)
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>(*) Насколько я представляю, большинство статически типизированных языков этого не умеют. Впрочем, я знаком только с более-менее практически использующимися статически типизированными языками, поддерживающими ООП, и не со всеми одинаково хорошо, так что тут могу легко заблуждаться.


    Дотнет умеет при помощи TransparentProxy, но ценой заметной потери производительности.
    ... << RSDN@Home 1.1.4 beta 3 rev. 219>>
    AVK Blog
    Re[20]: Обновление
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 02.11.04 08:19
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Насколько я понял парсеру Оберона плевать на кегель букв (или я ошибаюсь?).


    Обероны, еще со времен Модулы регистрозависимые (БОЛЬШИЕ и маленькие буквы — считаются разными символами), это только Паскаль был регистронезависимым.
    Re[26]: Мэйнстрим vs. Самосовершенствование :)))
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 02.11.04 08:24
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Все зависит от определений. В любом случае, если очереди нельзя сортировать, то они не будут предоставлять интерфейс, нужный функции sort(). Если они уже предоставляют такой интерфейс, то наличие "внешней" функции sort() никак на ситуацию не влияет, т.к. пользователь уже волен это делать своими действиями.


    И все таки, ты можешь, без привлечения умных слов, объяснить чем такой вариант:
    public interface ISortable
    {
        void Sort();
    }
    
    public class SomeList : IList, ISortable
    {
        ...
        public void Sort() {...}
    }
    
    ...
    someListInstance.Sort();


    хуже такого:

    public interface ISupportSort : IList
    {
        int CompareElements(int index1, int index2);
        void Exchange(int index1, int index2);
    }
    
    public class SomeList : IList, ISupportSort
    {
        ...
        int ISupportSort.CompareElements(int index1, int index2) {}
        void ISupportSort.Exchange(int index1, int index2) {}
    }
    
    ...
    SomeSortFunction(someListInstance);
    ... << RSDN@Home 1.1.4 beta 3 rev. 219>>
    AVK Blog
    Re[15]: Обновление
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 02.11.04 08:26
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD> Забавно. Работаешь на одном, а рекламирушь другое... Не находиш — это странным?


    Нахожу. А что делать? Не работать или не рекламировать? Тут и так не особо врубаются почему я на Дельфи пишу, а не на С++. А уж если я на БлэкБоксе на работе начну писать, то мне сразу скажут: "А что если ты когда-нибудь уволишься, то где мы найдем еще одного оберонщика чтобы сопровождать уже написанные программы?". А научиться — ни вкакую.
    Re[16]: Обновление
    От: KDelpher Россия  
    Дата: 02.11.04 09:16
    Оценка: 1 (1) +2
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Здравствуйте, VladD2, Вы писали:


    VD>> Забавно. Работаешь на одном, а рекламирушь другое... Не находиш — это странным?


    СГ>Нахожу. А что делать? Не работать или не рекламировать? Тут и так не особо врубаются почему я на Дельфи пишу, а не на С++. А уж если я на БлэкБоксе на работе начну писать, то мне сразу скажут: "А что если ты когда-нибудь уволишься, то где мы найдем еще одного оберонщика чтобы сопровождать уже написанные программы?". А научиться — ни вкакую.


    Попробуйте сами обосновать точку зрения начальства. Это не подколка. Это и в самом деле ценный прием. Вы представляете себя на месте начальника и объясняете кому-то, почему предпочтительнее не переучиваться. Возможно, после этого позиция начальства станет понятнее. А так же, возможно, найдутся новые аргументы против позиции начальства. А когда этот внутренний диалог закончится, итог его можно уже выложить сюда. Что-то вроде игры в шахматы сам с собой. Когда твой противник — ты сам, то с одной стороны приходится отыскивать у себя самого наиболее слабые доводы и бить именно по ним. А со второй — эти слабые доводы приходится укреплять, а то и осознавать свои ошибки. Взгляните на проблему с обоих сторон.
    Re[23]: Мэйнстрим vs. Самосовершенствование :)))
    От: alexeiz  
    Дата: 02.11.04 09:34
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Теперь что касается необходимости. Бесспорно, методы, не изменяющие состояние объекта можно выносить куда угодно. Более того, метода, не относящегося к самым базовым, вообще можно не делать. Вот только классы делаются для того чтобы потом ими пользовались люди. А стало быть, довольно неразумно выносить их черти куда. Это приводит к тому, что писать код становится значительно сложнее. И к тому, что приходится хранить в краткосрочной памяти слишком много деталей. А ведь все парадигмы программирования как раз и создаются для того чтобы уменьшить количество информации которых человек должен хранить у себя в голове. Попробую проиллюстрировать это на простом примере. Когда я пишу программу на C#, то все вокруг меня является объектом! Это не громкие слова. Это большое достижение в области поднятия уровня языка. Для того чтобы найти нужные средства работы с некоторыми объектами (функции для работы с переменными в терминологии С/С++) у меня есть выбор нажать точку после имени объекта, или полезть в документацию. Да и в документации одно дело искать методы некоторого класса, а другое функции применимые к этому классу в принципе. Даже если метод реализован как статический, я обязан всего лишь убедится, что нужного метода нет в интерфейсе используемого мной объекта, после чего попробовать поискать его в соответствующем классе. Например, для С++ перевод строки в целое будет таким же убогим как и для замшелого С:

    VD>
    VD>string str("123");
    VD>int val = atoi(str.c_str);
    VD>

    VD>А на более высокоуровневых языках это будет выглядеть немного иначе.
    VD>C#:
    VD>
    VD>string str = "123";
    VD>int val = int.Parse(str);
    VD>

    VD>Ruby (и еже с ним):
    VD>
    VD>str = "123";
    VD>val = str.to_i;
    VD>

    VD>казалось бы, какая разница? Я и сам написал все примеры по памяти. Но, черт побери, зачем мне знать все эти мелочи, если среда способна мне подсказать всю необходимую информацию?! Мы же, в конце концов, живем в 21 веке! А ведь ситуации могут быть куда сложнее. Так что подобная помощь была бы полезна не только новичкам.

    VD>В обещем, ООП — это концепция не только утилитарная. Это конецпция цель которой поднять уроветь разработки ПО. И исходя из этой концепции смотреть на вещи только из соображений необходимости ("никакой необходимости!") подразумевая под этим "можно не применять значит нужно не применять" является большой ошибкой! Необходимость хотя бы в том, что это упрощает написание кода и его восприятие. Зачастую класс поясняет значение метода. Зачастую сочетание типа и члена дают куда больше информации чем имя отдельной фукции.


    Позволь мне на примере atoi продемонстрировать, как наличие свободных функций в C++ позволяет расширять интерфейс различных классов, которые могут быть 1) созданы кем-то другим и постовляемые с библиотеками третьих фирм, 2) не имеющими между собой ничего общего, 3) являющиеся встроенными типами языка.

    Допустим у нас есть коллекция чисел, полученных ввиде строк, для которых нужно посчитать сумму. Алгоритм прост: используем atoi() для преобразования строк в числа:
    template < typename Iter >
    int generic_sum( Iter begin, Iter end )
    {
        int sum = 0;
        for ( ; begin != end; ++begin )
            sum += atoi( *begin );
        return sum;
    }

    Так что следующий код выдаёт нужную нам сумму:
        vector< char const * > arr_cstr;
        arr_cstr.push_back( "10" );
        arr_cstr.push_back( "20" );
        arr_cstr.push_back( "30" );
        cout << generic_sum( arr_cstr.begin(), arr_cstr.end() ) << endl;

    M’Kay. Через некоторое время нам потребовалось проделать эту операцию для коллекции из строк типа wstring. Не может быть ничего проще: определяем новую функцию atoi(). Заметь, что это не требует изменений существующем коде, который может быть в отдельной библиотеке и недоступен для изменения. Также, atoi не является методом (какого либо) класса, поэтому нет нужды определять его в wstring, чтобы приспособить алгоритм generic_sum для класса wstring.
    int atoi( wstring const & str )
    {
        return _wtoi( str.c_str() );
    }

    После чего следующий код прекрасно работает:
        vector< wstring > arr_wstr;
        arr_wstr.push_back( L"10" );
        arr_wstr.push_back( L"20" );
        arr_wstr.push_back( L"30" );
        cout << generic_sum( arr_wstr.begin(), arr_wstr.end() ) << endl;

    M’Kay. И так далее, идея понятна. Если этот пример кажется надуманным, то посмотри на стандартную библиотеку C++ где подобный метод расширения интерфейсов классов используется сплошь и рядом: операторы << и >> для потоков, swap, оператор сравнения < и т.д.

    А вот другой реальный пример, как с помощью свободных функций можно подвести под общий интерфейс абсолютно не связанные между собой классы: Access Shims (http://www.cuj.com/documents/s=8681/cuj0308wilson).

    В языках, где свободные функции не поддерживаются такое сделать достаточно проблемматично. Это либо cut’n’paste (т.е. generic_sum должен быть переписан для каждого нового типа), либо выкрутасы наподобие ICustomFormater для TextWriter в библиотеке .NET, которые возможны пока ты используешь только одну библиотеку, в которой всё чисто-гладко и согласованно. Как только нужно работать с разными несогласованными библиотеками, остается только cut’n’paste.

    Я не хочу сказать, что подобный метод повторного использования кода в C++ подходит под концепции OOP. В том и суть, что если OOP позволяет наиболее эффективно организовать код, то ты используешь OOP. В тех ситуациях, где OOP этого сделать не позволяет, ты используешь другие методы как, например, этот.
    Re[23]: Мэйнстрим vs. Самосовершенствование :)))
    От: LaptevVV Россия  
    Дата: 02.11.04 10:11
    Оценка:
    Здравствуйте, Зверёк Харьковский, Вы писали:

    ЗХ>Есть такие языки — Esoteric programming languages

    ЗХ>Ну, которые сделаны для прикола или из вредности... Вроде BrainFuck или Whitespace
    ЗХ>Так вот, на одном из сайтов, посвященных таким языкам, в список эзотерических попал
    ЗХ>

    ЗХ>AKI (AvtoKod Ingenera, "engineer's autocode") for Minsk family of computers

    ЗХ>Так что — могем!
    Я на нем писал!
    Хочешь быть счастливым — будь им!
    Без булдырабыз!!!
    Re[20]: Мэйнстрим vs. Самосовершенствование :)))
    От: LaptevVV Россия  
    Дата: 02.11.04 10:15
    Оценка:
    Здравствуйте, Зверёк Харьковский, Вы писали:

    ЗХ>Здравствуйте, LaptevVV, Вы писали:


    LVV>>Можно немного прочитать в книжке Брауна "Макропроцессоры и мобильность ПО" издательства Мир серия МО ЭВМ

    ЗХ>Валерий Викторович! Ну прекратите дразниться, а?
    ЗХ>Ну не у всех же университетская библиотека под рукой!
    ЗХ>А то одолжить попрошу
    1. В университетской библиотеке таких книжек нету — это мои
    2. "Макропроцессоры..." я недавно через инет нашел — прямо по гуглю. Адреса не помню, но на этом сайте-магазине много старых книжек продается.
    Хочешь быть счастливым — будь им!
    Без булдырабыз!!!
    Re[33]: Мэйнстрим vs. Самосовершенствование :)))
    От: Кодт Россия  
    Дата: 02.11.04 10:19
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    ПК>>
  • Есть классы: Matrix и Vector. Методами какого класса являются функции: 1) умножения матрицы на вектор (результат — матрица); 2) умножения двух векторов по схеме "строка на столбец" (результат — матрица); 3) скалярного умножения векторов (результат — число); 4) афинных трансформаций вектора в соответствии с заданной матрицей преобразования?
    S>Хм. Задумался.

    Как это "хм"?! Конечно, тензоры!
  • http://files.rsdn.org/4783/catsmiley.gif Перекуём баги на фичи!
    Re[28]: Мэйнстрим vs. Самосовершенствование :)))
    От: Undying Россия  
    Дата: 02.11.04 10:24
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    >> Внешняя функция сортировки нарушает инкапсуляцию коллекции, т.к. ее использование означает явное указание метода сортировки.


    ПК>Не обязательно:

    ПК>
    ПК>class Collection1;
    ПК>class Collection2;
    
    ПК>void sort(Collection1&);
    ПК>void sort(Collection2&);
    ПК>


    Этот финт ушами проходит только в том случае, если мы работаем с конкретными типами коллекций, не скрытыми за интерфейсами, что сам понимаешь в общем случае нехорошо.
    ... << RSDN@Home 1.1.2 stable >>
    Re[21]: Обновление
    От: Зверёк Харьковский  
    Дата: 02.11.04 10:41
    Оценка: +1
    Здравствуйте, Сергей Губанов, Вы писали:

    VD>>Насколько я понял парсеру Оберона плевать на кегель букв (или я ошибаюсь?).


    СГ>Обероны, еще со времен Модулы регистрозависимые (БОЛЬШИЕ и маленькие буквы — считаются разными символами), это только Паскаль был регистронезависимым.


    Тем хуже для оберона. Набирать ключевые слова большими буквами противоестественно (все время зажимать шифт или дергать капс лок). Костыли, встроенные в BlackBox (клавиатурная комбинация для смены регистра последнего слова) — всего лишь костыли.
    Об этом при проектировании языка никто не задумался?
    сам слушаю и вам рекомендую: Разные Люди — Отчизна
    FAQ — це мiй ай-кью!
    Re[22]: Обновление
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 02.11.04 10:59
    Оценка: -2
    Здравствуйте, Зверёк Харьковский, Вы писали:

    ЗХ>Набирать ключевые слова большими буквами противоестественно


    ЭТО ВСЕГО ЛИШЬ ВОПРОС ПРИВЫЧКИ.
    Re[24]: Мэйнстрим vs. Самосовершенствование :)))
    От: Зверёк Харьковский  
    Дата: 02.11.04 11:00
    Оценка:
    Здравствуйте, LaptevVV, Вы писали:

    LVV>Здравствуйте, Зверёк Харьковский, Вы писали:


    ЗХ>>Есть такие языки — Esoteric programming languages

    ЗХ>>Ну, которые сделаны для прикола или из вредности... Вроде BrainFuck или Whitespace
    ЗХ>>Так вот, на одном из сайтов, посвященных таким языкам, в список эзотерических попал
    ЗХ>>

    ЗХ>>AKI (AvtoKod Ingenera, "engineer's autocode") for Minsk family of computers

    ЗХ>>Так что — могем!
    LVV>Я на нем писал!
    LVV>
    И как? Он достаточно Esotheric?
    сам слушаю и вам рекомендую: Разные Люди — Ливень
    FAQ — це мiй ай-кью!
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.