На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 368 369 [370] 371 372 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Цитата korvin @
    пожалуйста: в Хаскелле мы не можем иметь одновременно обобщенную реализацию какого-то "метода" и конкретную
    ...
    если мы определили инстанс для обобщенного типа
    ExpandedWrap disabled
      instance Eq ([] a) where
        [] == []  =  True
        [] == ys  =  False
        xs == []  =  False
        (x:xs) == (y:ys)  =  x == y && xs == ys

    то не можем определить инстанс для конкретного [Int] например.

    Т.е. тайпклассы менее гибкие? Жаль. Хотя мне кажется, что тайпклассы где-то между traits и интерфейсами.
      Цитата korvin @
      Цитата D_KEY @
      traits работают с типами, а не объектами.

      по-твоему в динамике нет типов? o_O'

      Ты забыл свои слова? Я отвечал на "расширить набор операций над объектами".
        Цитата D_KEY @
        Как этот код связан с обсуждением? На С++ аналог выглядит так:
        ExpandedWrap disabled
          int f(int x) { return x; }
          double f(double x) { return x; }
           
          int main()
          {
              std::cout << f(1) << std::endl;
              std::cout << f(1.0) << std::endl;
          }

        ну ты же знаешь, почему в С++ так можно, а в джаве нет, твое замечание немного не в тему. ты бы мог указать на более очевидный и значимый недостаток в джавокоде =)
          Цитата korvin @
          ты бы мог указать на более очевидный и значимый недостаток в джавокоде =)

          Причем тут недостатки, когда код просто не относится к обсуждению?
            Цитата D_KEY @
            Я уже говорил о char_traits, а также о iterator_traits и предоставляемый там тип категории итератора.
            Вот пример std::iterator_traits + специализация для указателей(которые по сути являются итераторами произвольного доступа).
            ExpandedWrap disabled
                template <class Iterator>
                struct iterator_traits {
                  typedef typename Iterator::iterator_category iterator_category;
                  typedef typename Iterator::value_type        value_type;
                  typedef typename Iterator::difference_type   difference_type;
                  typedef typename Iterator::pointer           pointer;
                  typedef typename Iterator::reference         reference;
                };
               
                template <class T>
                struct iterator_traits<T*> {
                  typedef random_access_iterator_tag iterator_category;
                  typedef T                          value_type;
                  typedef ptrdiff_t                  difference_type;
                  typedef T*                         pointer;
                  typedef T&                         reference;
                };

            я нифига не понял, зачем это нужно и почему без этого обойтись нельзя.

            Добавлено
            Цитата D_KEY @
            Т.е. тайпклассы менее гибкие? Жаль. Хотя мне кажется, что тайпклассы где-то между traits и интерфейсами.

            т.е. тайпклассы более строгие, простые, очевидные, предсказуемые. никаких сюрпризов.
            а шаблоны менее гибкие, чем макросы CL и Scheme. жаль

            Добавлено
            Цитата D_KEY @
            Ты забыл свои слова? Я отвечал на "расширить набор операций над объектами".

            а что, в
            ExpandedWrap disabled
              PointTraits<T>::getX(point);

            point -- это тип, а getX -- операция над типом?

            цель-то использования трейтов какая?
              Цитата korvin @
              я нифига не понял, зачем это нужно и почему без этого обойтись нельзя.

              Я приводил пример. Функция advance, продвигающая итератор вперед на заданное число позиций, работает по разному с разными видами итераторов. Так, для итераторов произвольного доступа это можно сделать за одну операцию.
              А вообще обойтись можно без чего угодно практически. brainfuck же тьюринг-полный язык, почему им не воспользоваться?


              Цитата
              т.е. тайпклассы более строгие, простые, очевидные, предсказуемые. никаких сюрпризов.

              А какие сюрпризы с шаблонами?

              Цитата
              а шаблоны менее гибкие, чем макросы CL и Scheme. жаль

              У них совершенно разные юзкейсы.

              Цитата
              цель-то использования трейтов какая?

              Прочитай уже статью, что я давал.
              Сообщение отредактировано: D_KEY -
                Цитата korvin @
                я нифига не понял, зачем это нужно и почему без этого обойтись нельзя.
                Можно. Но после знакомства с фичей и осознания её потенциала, если её отобрать, будет неудобно и грустно.
                Цитата korvin @
                цель-то использования трейтов какая?
                Как обычно, в инкапсуляции - отделении структуры абстракции от её поведения (имеется ввиду определение инкапсуляции по Бучу).
                  Цитата D_KEY @
                  Я приводил пример. Функция advance, продвигающая итератор вперед на заданное число позиций, работает по разному с разными видами итераторов. Так, для итераторов произвольного доступа это можно сделать за одну операцию.

                  и что? трейты-то тут что дают?

                  Цитата D_KEY @
                  А какие сюрпризы с шаблонами?

                  мы уже это обсуждали.

                  Цитата D_KEY @
                  У них совершенно разные юзкейсы.

                  о, ну конечно, перечисли юзкейсы шаблонов.

                  Цитата D_KEY @
                  Прочитай уже статью, что я давал.

                  я-то прочитал, мне твое мнение не очень понятно.

                  Добавлено
                  Цитата Qraizer @
                  Как обычно, в инкапсуляции - отделении структуры абстракции от её поведения (имеется ввиду определение инкапсуляции по Бучу).

                  это прекрасно делается и без [таких] трейтов
                    Цитата korvin @
                    Цитата D_KEY @
                    Я приводил пример. Функция advance, продвигающая итератор вперед на заданное число позиций, работает по разному с разными видами итераторов. Так, для итераторов произвольного доступа это можно сделать за одну операцию.

                    и что? трейты-то тут что дают?

                    ExpandedWrap disabled
                        //...
                          typedef /*...*/ iterator_category;
                        //...

                    А дальше через перегрузку функций по этому типу.

                    Цитата
                    мы уже это обсуждали.

                    И к чему пришли?

                    Цитата
                    о, ну конечно, перечисли юзкейсы шаблонов.

                    Создания обобщенных алгоритмов и структур данных.

                    Цитата
                    Цитата D_KEY @
                    Прочитай уже статью, что я давал.

                    я-то прочитал, мне твое мнение не очень понятно.

                    Эм.. Мне нравится эта идиома :) А сама она хорошо в статье описана.

                    Добавлено
                    Цитата korvin @
                    Цитата Qraizer @
                    Как обычно, в инкапсуляции - отделении структуры абстракции от её поведения (имеется ввиду определение инкапсуляции по Бучу).

                    это прекрасно делается и без [таких] трейтов

                    Пока твои примеры на яве только перегрузку функций эмулировали.
                    Сообщение отредактировано: D_KEY -
                      Цитата D_KEY @
                      И к чему пришли?

                      ни к чему, каждый остался при своем мнении.

                      Цитата D_KEY @
                      Создания обобщенных алгоритмов и структур данных.

                      а макросы с этим не справляются?

                      Цитата D_KEY @
                      Эм.. Мне нравится эта идиома :) А сама она хорошо в статье описана.

                      я спрашивал о целях ее применения. ты их можешь назвать? вон, Qraizer назвал -- инкапсуляция по Бучу.
                      в статье также описана пара случаев применения, я не об этом.

                      Цитата D_KEY @
                      Пока твои примеры на яве только перегрузку функций эмулировали.

                      не эмулировали, это и есть перегрузка. методов. но я о другом. о том, что цели применения трейтов легко достигаются и без них.
                        Цитата korvin @
                        Цитата D_KEY @
                        Создания обобщенных алгоритмов и структур данных.

                        а макросы с этим не справляются?

                        Макросы нужны для другого :)

                        Цитата
                        Цитата D_KEY @
                        Эм.. Мне нравится эта идиома :) А сама она хорошо в статье описана.

                        я спрашивал о целях ее применения. ты их можешь назвать?

                        Гибкое(расширяемое и настраиваемое) использование различной информации о "типах". Или тебе не понятно, зачем эта информация нужна?
                        Не очень понимаю, что тебе непонятно.

                        Цитата
                        вон, Qraizer назвал -- инкапсуляция по Бучу.

                        Скорее это пример абстракции.

                        Цитата
                        о том, что цели применения трейтов легко достигаются и без них.

                        Да, а вместо виртуальных функций можно добавлять в объект указатель на таблицу с указателями на функции. Очень удобно :D
                          Во-первых, не так легко, как с ними. В конце концов и динамический полиморфизм легко получается без виртуальных методов и вообще классов, достаточно иметь некие кортежи данных, например C-шные структуры, функции, принимающие их параметрами, и массивы указателей на кортежи таких функций. Cшная потоковая библиотека ввода/вывода, чей интерфейс документирован в stdio.h - прекрасный пример такой библиотеки (с учётом, что полиморфность там скрыта как деталь реализации, потому и недокументируется, но в любой реализации, не завязанной жёстко на платформу, что характерно для встроенных систем - да можно просто в gcc посмотреть - она там присутствует в лице предоставляемых пользователем/разработчиком функций, отвечающими за непосредственный обмен данными с внешними носителями).
                          Во-вторых, не так уж легко во всех случаях. Несложно добавить свойства к своему классу каким-нибудь наследованием, но как их добавить к POD-типам, в частности стандартным? А так имеем
                          ExpandedWrap disabled
                            template <typename Char, typename Traits = char_traits<Char> > class basic_string;
                          и пожалуйста, меняя свойства, делаем наши символы регистро- и диакритически-независимыми при сравнении.
                          В-третьих, свойства являются частным случаем паттерна Стратегии. Если подходить с обобщённой позиции, то свойства - это политика поведения, и она просто должна быть отделена от сушности, чьи свойства она описывает. Всякие там наследования тут не к месту совершенно.
                            Цитата Qraizer @
                            Во-вторых, не так уж легко во всех случаях. Несложно добавить свойства к своему классу каким-нибудь наследованием, но как их добавить к POD-типам, в частности стандартным? А так имеем
                            ExpandedWrap disabled
                              template <typename Char, typename Traits = char_traits<Char> > class basic_string;
                            и пожалуйста, меняя свойства, делаем наши символы регистро- и диакритически-независимыми при сравнении.
                            В-третьих, свойства являются частным случаем паттерна Стратегии. Если подходить с обобщённой позиции, то свойства - это политика поведения, и она просто должна быть отделена от сушности, чьи свойства она описывает. Всякие там наследования тут не к месту совершенно.

                            при чем тут наследование? в нормальных языках методы отделены от типа и/или их свободно можно добавлять когда нужно =)

                            Haskell:
                            ExpandedWrap disabled
                              class Property a wnere
                                  property :: a -> String
                               
                              instance Property Int where
                                  property i = case i of
                                      0 -> "zero"
                                      1 -> "one"
                                      ...
                                      9 -> "nine"
                                      n -> "very big number"


                            Go:
                            ExpandedWrap disabled
                              func (i int) Property () {
                                  switch i {
                                      case 0:  return "zero"
                                      ...
                                      default: return "very big number"
                                  }
                              }


                            CL:
                            ExpandedWrap disabled
                              (defmethod property ((i integer))
                                (case i
                                  (0 "zero")
                                  ...
                                  (else "very big number")))


                            в Ruby и Kotlin тоже можно, в Objective-C вроде можно через протоколы

                            а про стратегии я тебе уже говорил о ФВП
                              Цитата korvin @
                              Haskell:

                              Ты фактически показал тоже самое, что и делают traits class :)
                                Цитата D_KEY @
                                Да, а вместо виртуальных функций можно добавлять в объект указатель на таблицу с указателями на функции. Очень удобно :D

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

                                в динамически типизированных да, необходимо в объекте иметь метку типа, ну так она в любом случае там есть, в чем проблема? дополнительную информацию при этом можно хранить где угодно
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 368 369 [370] 371 372 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.5332 ]   [ 14 queries used ]   [ Generated: 30.07.26, 21:24 GMT ]