На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Неведомая велосипедная конструкция - помогите распознать!
    Всем прива!

    Я уже и не помню, где и когда, и в каком контексте видел конструкцию типа:

    ExpandedWrap disabled
      int main() {
        SomeClass some;
        some.
         method01().
         method22().
         method32().
         methodFinal();
      }


    Понятное дело - это "псевдокод-велосипед". Но я это не от балды привёл, где-то подобное видел!
    Прошу "распознать" =) Что это? Какой паттерн из GoF это реализует (если оно так), и прошу привести синтетический пример на С++ где такое можно использовать!
      Ну... каждый метод возвращает ссылку на что-то, что имеет очередной соответствующий публичный метод. Я бы стал это называть паттерном, сам нередко так пишу, когда возможно.
        Цитата Qraizer @
        Я бы стал это называть паттерном

        Ну да, паттерн ... но ты отжег :lool: Что-то вспомнился анекдот:

        Цитата
        Сидят грузин и армянин. Пьянствуют чячу ...
        Грузин: Послушай, генацвале, грузины лучше чем армяне!
        Армянин: Эй, а чем лучше?
        Грузин: Как чем? Чем армяне!

        Я "распознал" эту шляпу в плане паттернов проектирования GoF - она называется "Цепочка обязанностей". По ссылке немного не то, хотя и по теме. А вот много по теме - синтетический пример:

        ExpandedWrap disabled
          #include <iostream>
          #include <string>
           
          class SomeClass {
              int counter = 0;
          public:
              SomeClass& method1() {
                  counter++;
                  std::cout << "Method 1 called" << ", counter: " << counter << std::endl;
                  return *this;
              }
           
              SomeClass& method2() {
                  counter++;
                  std::cout << "Method 2 called" << ", counter: " << counter << std::endl;
                  return *this;
              }
           
              SomeClass& method3() {
                  counter++;
                  std::cout << "Method 3 called" << ", counter: " << counter << std::endl;
                  return *this;
              }
           
              void methodFinal() {
                  counter = 0;
                  std::cout << "Final method called" << ", counter: " << counter << std::endl;
              }
          };
           
          int main() {
              SomeClass some;
              some.method1().method2().method3().methodFinal();
              return 0;
          }

        Очень похоже на паттерн "Строитель", но всё же это не он.
          Я такую цепочку и на С построю запросто:
          ExpandedWrap disabled
            const char head[] = "Read error of \"";
            const char mid [] = "\". Error code is ";
            const char tail[] = ".\n";
                  char err [sizeof(errno)*2*6/5+1];       /* (2 hex per byte) * (log10(16)≈12/10) + NUL */
             
            /* ... */
             
            char *msg = strcat(
                          strcat(
                            strcat(
                              strcat(   /* NULs: -1   +        -1   +         -1   +           0      +       -1+1 >--+ */
                                strcpy( /*                                                                            ! */
                                  malloc(sizeof(head) + sizeof(mid) + sizeof(tail) + strlen(fileName) + sizeof(err) - 3)
                                , head)
                              , fileName)
                            , mid)
                          , (_itoa(errno, err, 10), err))
                        , tail);
            fputs(msg, stderr);
            free(msg);


          Добавлено
          А уж operator<< в потоки вывода так вообще все юзали

          Добавлено
          P.S. «Строитель» напоминает недавний разговор об опциональных именованных параметрах в Холиварах. ИМХО ты слишком увлекаешься паттернами. Где-то в нулевых как-то читал, что они скорее вредят, чем помогают, т.к. по факту стандартизируют лишь архитектурные решения, но не реализации. Это, мол, приводит к тому, что паттерн очень сложно распознать глазами по коду, а когда можно, крайне тяжело их ревьюжить на предмет багов реализации. А самое главное то, что общие архитектурные решения практически никогда не подходят в конкретным случаях, и их приходится адаптировать, что фактически стандартизацию сводит на нет. В итоге на спринтах дискуссии сваливаются в обсуждение паттернов и споров вокруг их корректности вместо обсуждения реальных задач и проблем.
            Цитата Qraizer @
            ИМХО ты слишком увлекаешься паттернами.

            Тебе это кажется :) Да, эта тема для меня интересна. Но я давно к таким вещам отношусь без фанатизма. Подход простой - не натягивать сову на глобус. Там, где это явно уместно, там использовать. В остальных случаях надо оценивать плюсы/минусы от применений. Да, я тоже где-то читал, более того - видел анимированный гифчег, как демонстрировали неуместное усложнение кода путем насильственного применения паттернов. Что-то типа фабрики Хэлоу Ворлдов. Поэтому я строго за целесообразность.
              Цитата Majestio @

              В жабе это часто встречается. Зачастую называю билдером
              Ну и в плюсах легко реализуется через возврат сссылки на объект с нужными методами в каждом вызове метода. Ближайшая аналогия возврат *this в операторах
              Сообщение отредактировано: sharky72 -
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0329 ]   [ 15 queries used ]   [ Generated: 16.06.25, 11:30 GMT ]