Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Флейм (http://www.flasher.ru/forum/forumdisplay.php?f=53)
-   -   Как не превратить код в антипаттерны? (http://www.flasher.ru/forum/showthread.php?t=208698)

Gerbert 16.08.2014 22:37

Как не превратить код в антипаттерны?
 
Долго искал раздел с названием "курилка" или "обо всем", но безрезультатно.. Но вот он!)

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

Вот например "команда", у которой есть публичный метод execute, который во всех примерах, ничего не возвращает. А если мне нужно чтобы возвращал? Будет ли его переделывание отправлять мой код в сторону антипаттернов?

И есть какие-то критерии, возможно описанные в каких-то книгах, где говорится о допустимом приделе
изменения паттернов?

Есть например "спецификация", паттерн, который по своей задумки возвращает только булево значение.
А если взять и изменить его до возвращения всех значений. То это тоже будет не айс?

MikroAcse 16.08.2014 22:40

Пиши код, чтобы было удобно и не сложно.
Комментируй слабые участки.
Старайся не плодить лишние сущности, но при этом не писать всё в одном месте.

Вот и всё.

Gerbert 16.08.2014 22:50

Это понятно и просто, не плодить сущности, один объект - одна обязанность, но эта дорога ведет в сторону антипаттернов. Это не имеет значения, если бы я хотел все время код только для себя писать.
Но ведь хочется ещё что-то сделать полезного, но при этом не хочется, чтобы мой код назвали кривым.
Да и вообще нужно же совершенствоваться. И на сей момент мне кажется, что предел это уметь видеть грань, которая отличает паттерн от антипаттерна.

Ведь это очень насущная тема. Даже если не знать об их существовании, то все равно пишешь код,
который давно уже описали, структурировали и даже придумали, как его писать нельзя.
И вот после всего этого хочется получить ответ, хотя бы на два заданных вопроса выше и
уже исходя из ответов, начинать рисовать эту грань.

illuzor 16.08.2014 23:59

Паттерны, это по сути просто условность (сейчас в меня палки полетят). Вы заморачиваетесь на ерунде.

Gerbert 17.08.2014 00:24

Цитата:

Паттерны, это по сути просто условность (сейчас в меня палки полетят).
И от меня десяток!

Я не понимаю людей, которые не понимая важности, говорят, что это не важно, только потому, ято они сами живут без этого.
Еще жаль, что вместо ответа, мне приходится слышать слова "ерунда", что приравнивает значимость моего вопроса, к ерунде! И если бы дело было только в Вас, но ведь другой посмотрит и подумает, что Вы правы!
А это не только утопит мой вопрос, но и ещё отнимет у кого-то много времени.
Вот скажите, Вы повторяете, как сорока, слова "читабельность кода", "время разработки"?
Не обращайте внимание на слова "сорока", так-как я считаю, что Вас они не заденут, только на основе того, что меня лично, они бы не задели!
И вот тут я объясню дальше - дал я Вам задание доработать код, а там сто классов и все с говорящими именами - "Зверушка", "ВсеОгороды", "Инвентарь". Вы можете сказать, что с этим делать?
А вот если бы Вы знали, что этот класс Декоратор, а эти Momento и Proxy. Вы бы сразу разобрались, как устроено приложение, даже не видя самих классов. Это не читаемость свойств, это читаемость приложения. Разве это "просто ерунда"?

illuzor 17.08.2014 00:45

Цитата:

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

Еще жаль, что вместо ответа, мне приходится слышать слова "ерунда"
Потому что ерунда и есть. Эти псевдо-философские беседы на пустом месте никому не нужны и ни к чему не приведут.
Вообще, код может быть понятен как с паттернами, так и без них. Точно так же и наоборот - можно написать отвратительный код, использую паттерны.

Gerbert 17.08.2014 00:53

Какие философские беседы, если я задал ДВА КОНКРЕТНЫХ ВОПРОСА?
Философия, это Ваш "ответ" -
Цитата:

Точно так же и наоборот - можно написать отвратительный код, использую паттерны.
И именно по этому я и задал этот КОНКРЕТНЫЙ вопрос!
Цитата:

Вообще, код может быть понятен как с паттернами, так и без них.
Код без паттернов, это как разговор без предложений. Такое может быть? Хотя "ыыыть" это не предложение, но его в премер ставить не нужно.

И личный вопрос - Вы идете по улице и видете тетку с банкой для денег и картонкой "помогите котятам".
Неужели Вы подойдете и будете говорить, что Вы не любите катят и она занимается ерундой?
Так вот и тут нужно так же, не нравится вопрос - мимо, зачем говорить своё мнение, когда Вас не спрашиваю?

Добавлено через 3 минуты
Цитата:

Я не говорил, что не пользуюсь паттернами.
И у Вас одиночка создается во всех классах, где к нему нужно обратится?
Или Вы только другим говорите о ерунде, а сами придерживаетесь традиций?
А когда нужно что-то изменить, то Вам лень спрашивать ерунду и Вы портите все так, как Вам хочется?

Добавлено через 4 минуты
То есть Вы осознано делаете месиво и после этого считаете, что этот, ТОЧНЫЙ вопрос является ерундой?)

Котяра 17.08.2014 01:34

Любые паттерны - это лишь набор рекомендаций (шаблонов), самое главно понять их суть - реализации одного и того же шаблона могут быть самыми разнообразными, тем более в разных языках.
Можно писать-дописывать свои реализации, если так будет удобнее в вашем конкретном случае - главное при этом не исказить смысл до противоположного.
Вернёмся к вашему вопросу о паттерне комманда - весь смысл этого паттерна - обособить действие в отдельный объект. Соответственно результат выполнения команды должен быть спрятан в этом объекте, кроме того, паттерн Команда не говорит ничего, каким должна быть эта команда - синхронная, асинхронная или ёще какая, соответственно никто не гарантирует, что execute может возвратить что-то.
Чаще всего - Команда - это объект, который совершает действия над другими объектами, передаными в качестве параметров конструктора.
Если вы измените это поведение - ничего страшного, но это уже будет другой паттерн.

Добавлено через 3 минуты
Цитата:

Но если шаблон немного не подходит под задачу, то это означает, что нужно от него отказаться или можно его видоизменить или даже компоновать с другими шаблонами?
Этот подход в корне неверен. Нельзя просто так взять и впихнуть конкретный паттерн в невпихуемое. Именно для задачи мы выбираем подходящий шаблон или пишем свой велосипед и никак иначе.

Добавлено через 12 минут
Цитата:

А вот если бы Вы знали, что этот класс Декоратор, а эти Momento и Proxy.
Это очень плохие имена, которые всё равно не внесут ясности. Называть имена по использующимся в них паттернам - упячка, т.к. один и тот же класс может быть одновременно как Декоратором, так и Контроллером, и даже, одновременно с этим, Видом, смотря с какой точки зрения на него посмотреть.

illuzor 17.08.2014 01:59

Цитата:

То есть Вы осознано делаете месиво и после этого считаете, что этот, ТОЧНЫЙ вопрос является ерундой?
Экстрасенс на форуме! Знает всё о моём коде, даже не видя его. Славься-славься... Простите.
Цитата:

Код без паттернов, это как разговор без предложений.
Паттерновый фанатик что ли? Аккуратней с этим.
Хотя, видимо, просто тролль. Не будем больше кормить.

nubideus 17.08.2014 02:22

Gerbert, https://github.com/EnterpriseQuality...erpriseEdition
идеальный код - ненаписанный код

Gerbert 17.08.2014 02:28

Котяра, Спасибо!
Цитата:

Это очень плохие имена, которые всё равно не внесут ясности.
Я немного не то имел ввиду. Имена должны быть в контексте приложения, но если знать, что
этот класс имеет отношение, к тому-то и тому-то паттерну, то разобраться будет куда легче.

Цитата:

Чаще всего - Команда - это объект, который совершает действия над другими объектами, передаными в качестве параметров конструктора.
Если я не ошибаюсь, то команда выполняет таски, в конструктор которых передаются обрабатываемые объекты. И объекты эти выполняются в публик методе execute. И если я Вас правильно понял, то если метод execute станет что-то возвращать, то командой это уже не будет. И получается, что нужно выполняемый метод во что-то оборачивать и тогда все останется в гармонии. Правильно я понял?

illuzor, поверьте, я тоже могу говорить грубости, но не Вам.

MikroAcse 17.08.2014 15:12

Gerbert, человек вам ответил, а вы сразу кидаетесь. Причём это правда. Если постоянно думать о паттернах - эффективность работы упадет в разы. Не фанатейте.

Gerbert 17.08.2014 15:32

MikroAcse, кидаетесь Вы, а я вступил в словесную перепалку.
Правда что? То что если думать постоянно о паттернах? А кто сказал, что я ПОСТОЯННО о них думаю?
Цитата:

Если постоянно думать о паттернах - эффективность работы упадет в разы.
Да ну нафиг! Вы исследования чтоль проводили? Или только что придумали?)))

Добавлено через 1 минуту
Вам осталось сказать - "сам я пользуюсь паттернами и соблюдаю чистоту их исполнения, но посоветую обратное и вопрос ерунда". И ждать орден.

MikroAcse 17.08.2014 18:00

Да уж. С Вами не о чем разговаривать. Вы умеете адекватно отвечать на вопросы и не начинать "словесную перепалку" с теми, кто Вам просто ответил?

Gerbert 17.08.2014 18:25

Цитата:

с теми, кто Вам просто ответил?
Цитата:

Gerbert, человек вам ответил, а вы сразу кидаетесь.
В русском языке это называется упрек.
Цитата:

Причём это правда.
Это Вы подтвердили... мне не понятно что.
Цитата:

Если постоянно думать о паттернах - эффективность работы упадет в разы.
Это вообще что?
И получается, что Ваш просто ответ, это вот эта непонятная фраза?
Цитата:

Не фанатейте.
В этой теме я получил только один адекватный ответ и этими словами я не хочу подчеркнуть то,
что Вы не способны дать ответ. Просто в этот раз, было бы полезней ( мне ), если бы Вы промолчали.
Вы ответа не дали, но наговорили на две страницы. И ещё меня вовлекли.

MikroAcse 17.08.2014 23:19

Я ничего не наговаривал. Кажется, это Вы на каждое моё слово отвечаете несколькими предложениями.

Но я не хочу больше спорить, Вы имеете права на свою точку зрения, как и я.

Котяра 18.08.2014 12:28

Вернёмся к паттерну Команда.
В том же as3commons.async
execute возвращает любые значения
http://www.as3commons.org/as3-common....html#Commands
Для асинхронных команд это не имеет смысла, но для синхронных - почему бы и нет?

ChuwY 18.08.2014 15:37

Для асинхронных можно добавить метод getResult и дергать его по событию выполнения или же передавать результаты в самом объекте события.

Котяра 18.08.2014 15:47

Там есть события, по которым срабатывают очереди и прочее. Для шаринга результатов я обычно передаю некий общий объект Context - в который пишут/читают/изменяют все команды из очереди.

Gerbert 18.08.2014 21:51

Цитата:

Для шаринга результатов я обычно передаю некий общий объект Context - в который пишут/читают/изменяют все команды из очереди.
Если в общих чертах, то это вот так или Вы о другом? Если о другом, то можно немного псевдо кода.
Код AS3:

var context:* = 1;
 
new Command()
.addCommand(new ReturnValueTask(foo1, context))
.addCommand(new ReturnValueTask(foo2, context))
 
private function foo1(n:int):int
{
        return n + 1;
}
 
private function foo2(n:int):int
{
        return n + 1;
}
 
package
{
        public class ReturnValueTask
        {
                public function ReturnValueTask(method:Function, context:*)
                {
 
                }
 
                public function execute():void
                {
                        context = method.call(null, context);
                }
        }
}


Котяра 18.08.2014 22:35

Нет смысл в другом. Вот простейший пример
Код AS3:

queue
.addCommand(new LoadXMLCommand(url, context)
.addCommand(new ParseXMLCommand( context);
queue.addCompleteListener(onXMLParsed);
queue.execute();

где context это класс с полями xml, value
- первая команда грузит xml и присваивает его полю context.xml
- вторая команда парсит context.xml и создаёт value (некий сериализованный объект)
- по событию комплит очереди мы просто смотрим нужное поле у контекста, на который у нас есть ссылка.

Gerbert 18.08.2014 22:38

Котяра, Спасибо! Понял.


Часовой пояс GMT +4, время: 05:00.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.