
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.75] |
![]() |
|
Сообщ.
#1
,
|
|
|
Всем прива!
Я уже и не помню, где и когда, и в каком контексте видел конструкцию типа: ![]() ![]() int main() { SomeClass some; some. method01(). method22(). method32(). methodFinal(); } Понятное дело - это "псевдокод-велосипед". Но я это не от балды привёл, где-то подобное видел! Прошу "распознать" =) Что это? Какой паттерн из GoF это реализует (если оно так), и прошу привести синтетический пример на С++ где такое можно использовать! |
![]() |
Сообщ.
#2
,
|
|
Ну... каждый метод возвращает ссылку на что-то, что имеет очередной соответствующий публичный метод. Я бы стал это называть паттерном, сам нередко так пишу, когда возможно.
|
Сообщ.
#3
,
|
|
|
Цитата Qraizer @ Я бы стал это называть паттерном Ну да, паттерн ... но ты отжег ![]() Цитата Сидят грузин и армянин. Пьянствуют чячу ... Грузин: Послушай, генацвале, грузины лучше чем армяне! Армянин: Эй, а чем лучше? Грузин: Как чем? Чем армяне! Я "распознал" эту шляпу в плане паттернов проектирования GoF - она называется "Цепочка обязанностей". По ссылке немного не то, хотя и по теме. А вот много по теме - синтетический пример: ![]() ![]() #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; } Очень похоже на паттерн "Строитель", но всё же это не он. |
![]() |
Сообщ.
#4
,
|
|
Я такую цепочку и на С построю запросто:
![]() ![]() 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. «Строитель» напоминает недавний разговор об опциональных именованных параметрах в Холиварах. ИМХО ты слишком увлекаешься паттернами. Где-то в нулевых как-то читал, что они скорее вредят, чем помогают, т.к. по факту стандартизируют лишь архитектурные решения, но не реализации. Это, мол, приводит к тому, что паттерн очень сложно распознать глазами по коду, а когда можно, крайне тяжело их ревьюжить на предмет багов реализации. А самое главное то, что общие архитектурные решения практически никогда не подходят в конкретным случаях, и их приходится адаптировать, что фактически стандартизацию сводит на нет. В итоге на спринтах дискуссии сваливаются в обсуждение паттернов и споров вокруг их корректности вместо обсуждения реальных задач и проблем. |
Сообщ.
#5
,
|
|
|
Цитата Qraizer @ ИМХО ты слишком увлекаешься паттернами. Тебе это кажется ![]() |
Сообщ.
#6
,
|
|
|
Цитата Majestio @ В жабе это часто встречается. Зачастую называю билдером Ну и в плюсах легко реализуется через возврат сссылки на объект с нужными методами в каждом вызове метода. Ближайшая аналогия возврат *this в операторах |