Регистрация  |  Вход

Паттерны проектирования это огромная трата времени.

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

Да все на словах звучит красиво, определения из мира ООП ласкают слух. Но, мля, как только дело доходит до реализации - это пи...ц. На простейшие веши, подчеркиваю ПРОСТЕЙШИЕ, уходят тонны apex классов, apex методов и просто сугробы всяких абстракций. Получается что вместо того чтобы знать apex и программировать, я должен изучать "язык программирования" того человека который начал реализовывать решение. КАЖДАЯ сточка - сплошные вызовы каких-то сервисов, с передачей всяких DTO которые еще надо знать как правильно инициализировать. ЗАЧЕМ ВСЕ ЭТО? Все равно когда встает вопрос о повторном использовании этого кода приходится лезть в эти сервисы и писать костыли под новые требования.
В итоге простейшая реализация функционала на полчаса превращается в день разбора того что хотел сделать первый программист и что "накостыляли" другие программисты после него. Причем спорить о правильности или неправильности выбранного подхода НЕЛЬЗЯ потому что у каждого свое видение паттернов и все превращается в холивар.

ЛЮДИ, KISS.

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

Да все на словах звучит красиво, определения из мира ООП ласкают слух. Но, мля, как только дело доходит до реализации - это пи...ц. На простейшие веши, подчеркиваю ПРОСТЕЙШИЕ, уходят тонны apex классов, apex методов и просто сугробы всяких абстракций. Получается что вместо того чтобы знать apex и программировать, я должен изучать "язык программирования" того человека который начал реализовывать решение. КАЖДАЯ сточка - сплошные вызовы каких-то сервисов, с передачей всяких DTO которые еще надо знать как правильно инициализировать. ЗАЧЕМ ВСЕ ЭТО? Все равно когда встает вопрос о повторном использовании этого кода приходится лезть в эти сервисы и писать костыли под новые требования.
В итоге простейшая реализация функционала на полчаса превращается в день разбора того что хотел сделать первый программист и что "накостыляли" другие программисты после него. Причем спорить о правильности или неправильности выбранного подхода НЕЛЬЗЯ потому что у каждого свое видение паттернов и все превращается в холивар.

ЛЮДИ, KISS.

На счет DRY - don’t repeat yourself. Тут именно ключевое слово yourself - себя. тут ничего не сказано про не повторяй другого человека. А почему? потому что это нереально. Если команда состоит более чем из одного человека - как можно не повторять другого? Вы умеете читать мысли других людей? Поэтому нафиг все эти DRY в больших проектах - есть кусок функционала - делаем его независимым, одиноким во вселенной. Твой функционал не должен знать что где-то в другом участке кода есть что-то аналогичное, потому что оно там может поменяться и тогда твоему коду придет пи...ц.

На счет DRY - don’t repeat yourself. Тут именно ключевое слово yourself - себя. тут ничего не сказано про не повторяй другого человека. А почему? потому что это нереально. Если команда состоит более чем из одного человека - как можно не повторять другого? Вы умеете читать мысли других людей? Поэтому нафиг все эти DRY в больших проектах - есть кусок функционала - делаем его независимым, одиноким во вселенной. Твой функционал не должен знать что где-то в другом участке кода есть что-то аналогичное, потому что оно там может поменяться и тогда твоему коду придет пи...ц.

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

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

Хорошая архитектура спасает тебя при поддержке большого приложения - факт!

Хорошая архитектура спасает тебя при поддержке большого приложения - факт!

Gres
Знаешь, мне кажется, использование различных подходов к программированию похоже на воспитание

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

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

ЛЮДИ, KISS

[quote="Gres"]Знаешь, мне кажется, использование различных подходов к программированию похоже на воспитание[/quote]
Когда воспитание централизованное, то еще можно говорить о какой-то степени слажености. НО где в программировании ты видел школы или университеты.
Программисты это многонациальный народ, и если у одних национальностей надо есть вилкой за столом, то у других можно есть руками сидя на земле. Но все в одном едины - надо пожрать!
И если документация - это догма без которой никуда, то паттерны проектирования всего лишь рекомендации, у которых кстати даже нет единого источника (кто во что горазд). Поэтому считаю что можно использовать рекомендации в личных целях, но выводить их на уровень "все должны это знать и использовать" никак нет.

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

ЛЮДИ, KISS :D 


Dmitry Shnyrev
Gres
Знаешь, мне кажется, использование различных подходов к программированию похоже на воспитание

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

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

ЛЮДИ, KISS :D


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

[quote="Dmitry Shnyrev"][quote="Gres"]Знаешь, мне кажется, использование различных подходов к программированию похоже на воспитание[/quote]
Когда воспитание централизованное, то еще можно говорить о какой-то степени слажености. НО где в программировании ты видел школы или университеты.
Программисты это многонациальный народ, и если у одних национальностей надо есть вилкой за столом, то у других можно есть руками сидя на земле. Но все в одном едины - надо пожрать!
И если документация - это догма без которой никуда, то паттерны проектирования всего лишь рекомендации, у которых кстати даже нет единого источника (кто во что горазд). Поэтому считаю что можно использовать рекомендации в личных целях, но выводить их на уровень "все должны это знать и использовать" никак нет.

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

ЛЮДИ, KISS :D[/quote]
Согласен с тем, что шаблоны - это всего лишь рекомендации.
Конечно, среди всех разработчиков они не будут одинаковыми, но в команде реально договориться, какая бы по размеру она не была.

Dmitry Shnyrev
ЛЮДИ, KISS

Люди читайте ГОФа и Фаулера! :)

[quote="Dmitry Shnyrev"]ЛЮДИ, KISS [/quote]
Люди читайте ГОФа и Фаулера! :)

Gres
Люди читайте ГОФа и Фаулера! :)

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

[quote="Gres"]Люди читайте ГОФа и Фаулера! :)[/quote]
Не просто читайте, а заставляйте читать других, а то мир вокруг вас покажется серым и безрадостным. :D 

Gres
Конечно, среди всех разработчиков они не будут одинаковыми, но в команде реально договориться, какая бы по размеру она не была.

Это согласен, да. Сам сейчас в такой ситуации что приходится реально весь проект по кирпичикам разбирать чтобы знать что где и за что отвечает. Потому что каждый code review для 10 строчек заканчивается 10 замечаниями "мы это не используем, у нас для этого специальный метод написан". Получается уже не apex - а прямо "новый язык супер методов".

[quote="Gres"]Конечно, среди всех разработчиков они не будут одинаковыми, но в команде реально договориться, какая бы по размеру она не была.[/quote]
Это согласен, да. Сам сейчас в такой ситуации что приходится реально весь проект по кирпичикам разбирать чтобы знать что где и за что отвечает. Потому что каждый code review для 10 строчек заканчивается 10 замечаниями "мы это не используем, у нас для этого специальный метод написан". Получается уже не apex - а прямо "новый язык супер методов".

излил душу! Прямо полегчало

:D излил душу! Прямо полегчало :D 

Dmitry Shnyrev
Gres
Конечно, среди всех разработчиков они не будут одинаковыми, но в команде реально договориться, какая бы по размеру она не была.

Это согласен, да. Сам сейчас в такой ситуации что приходится реально весь проект по кирпичикам разбирать чтобы знать что где и за что отвечает. Потому что каждый code review для 10 строчек заканчивается 10 замечаниями "мы это не используем, у нас для этого специальный метод написан". Получается уже не apex - а прямо "новый язык супер методов".

И это правильно, хотя тебе это и не нравится.
Вообще ревью кода - хорошая практика!
И ты сам учишься и тебя учат.

[quote="Dmitry Shnyrev"][quote="Gres"]Конечно, среди всех разработчиков они не будут одинаковыми, но в команде реально договориться, какая бы по размеру она не была.[/quote]
Это согласен, да. Сам сейчас в такой ситуации что приходится реально весь проект по кирпичикам разбирать чтобы знать что где и за что отвечает. Потому что каждый code review для 10 строчек заканчивается 10 замечаниями "мы это не используем, у нас для этого специальный метод написан". Получается уже не apex - а прямо "новый язык супер методов".[/quote]
И это правильно, хотя тебе это и не нравится.
Вообще ревью кода - хорошая практика!
И ты сам учишься и тебя учат.

Dmitry Shnyrev
Gres
Люди читайте ГОФа и Фаулера! :)

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

Прямо в точку!

[quote="Dmitry Shnyrev"][quote="Gres"]Люди читайте ГОФа и Фаулера! :)[/quote]
Не просто читайте, а заставляйте читать других, а то мир вокруг вас покажется серым и безрадостным. :D[/quote]
Прямо в точку!

Dmitry Shnyrev
Gres
Конечно, среди всех разработчиков они не будут одинаковыми, но в команде реально договориться, какая бы по размеру она не была.

Это согласен, да. Сам сейчас в такой ситуации что приходится реально весь проект по кирпичикам разбирать чтобы знать что где и за что отвечает. Потому что каждый code review для 10 строчек заканчивается 10 замечаниями "мы это не используем, у нас для этого специальный метод написан". Получается уже не apex - а прямо "новый язык супер методов".

Здесь все очень просто есть такое понятие социализация в компании за неё отвечают специально подготовленные люди учат обращаться с корпоративными инструментами трекерами времени,деплоям кода в репозиторий,учат корпоративному стилю,даже треннинги проводят как пишется код в "нашей компании",. Этот процесс может занимать от 3 - 6 месяцев,как я работал с индусами долгое время,так там и полгода мало на изучения тех тысяч классов и индусы которые приходили очень часто не выдерживали разобраться в сокращенные сроки с проектом.

[quote="Dmitry Shnyrev"][quote="Gres"]Конечно, среди всех разработчиков они не будут одинаковыми, но в команде реально договориться, какая бы по размеру она не была.[/quote]
Это согласен, да. Сам сейчас в такой ситуации что приходится реально весь проект по кирпичикам разбирать чтобы знать что где и за что отвечает. Потому что каждый code review для 10 строчек заканчивается 10 замечаниями "мы это не используем, у нас для этого специальный метод написан". Получается уже не apex - а прямо "новый язык супер методов".[/quote]
Здесь все очень просто есть такое понятие социализация в компании за неё отвечают специально подготовленные люди учат обращаться с корпоративными инструментами трекерами времени,деплоям кода в репозиторий,учат корпоративному стилю,даже треннинги проводят как пишется код в "нашей компании",. Этот процесс может занимать от 3 - 6 месяцев,как я работал с индусами долгое время,так там и полгода мало на изучения тех тысяч классов и индусы которые приходили очень часто не выдерживали разобраться в сокращенные сроки с проектом. 

Я пишу код в Eclipse и тесты там прогоняю (ну, если один класс и надо протестить новый функционал). Так вот, если что-то где-то посмотреть, откуда вытягиваются данные, то ООП с его наследованиями и инкапсуляциями идет тут лесом.
Я один функционал как-то реализовал через ООП, а птм вылавливал "фичи". Это ж не Visual Studio для C# или Java проект в Eclipse. Так что ООП для Apex - это кошмар.
Повторяющийся код в одно место - да. Но я лучше почти продублирую два класса, кот будут отличаться 2-3 полями, но без Generics. Да, там подход одного инерфейса был. Был кошмар.

Я пишу код в Eclipse и тесты там прогоняю (ну, если один класс и надо протестить новый функционал). Так вот, если что-то где-то посмотреть, откуда вытягиваются данные, то ООП с его наследованиями и инкапсуляциями идет тут лесом.
Я один функционал как-то реализовал через ООП, а птм вылавливал "фичи". Это ж не Visual Studio для C# или Java проект в Eclipse. Так что ООП для Apex - это кошмар.
Повторяющийся код в одно место - да. Но я лучше почти продублирую два класса, кот будут отличаться 2-3 полями, но без Generics. Да, там подход одного инерфейса был. Был кошмар.

Chiz
Но я лучше почти продублирую два класса, кот будут отличаться 2-3 полями, но без Generics.

Их и так выпили, причем зря. Я давно негодую.

Chiz
Так что ООП для Apex - это кошмар.

При чем тут конкретный ЯП?

[quote="Chiz"] Но я лучше почти продублирую два класса, кот будут отличаться 2-3 полями, но без Generics.[/quote]
Их и так выпили, причем зря. Я давно негодую.

[quote="Chiz"]Так что ООП для Apex - это кошмар. [/quote]
При чем тут конкретный ЯП?

К паттернам нельзя приучить, их нельзя зазубрить, их нужно прочувствовать. И пока этого не произойдёт, организм будет отвергать их как вирус.
Кстати говоря, советую обратить внимание на это https://github.com/financialforcedev/fflib-apex-common + https://github.com/financialforcedev/fflib-apex-mocks (сори если повторяюсь, но вроде я на форуме не видел чтобы кто-то про это писал). В репах реализации UOW, обёртки над триггерами (triger handler) и казалось бы невозможные в Apex моки. Если следовать принципам, которые предлагают авторы совместно со статьями сала, то можно получить довольно независимую и прозрачную архитектуру Service, Domain, Selector. Есть примеры. Можем по обсуждать если заинтересовало. Особенно порадовал примитивный IOC контейнер :). С этим инструментом можно писать независимый код, который в паре с моками можно легко тестировать. DRY всем!

видео с DF: https://www.youtube.com/watch?v=qlq46AEAlLI
слайды к видео: https://docs.google.com/file/d/0B6brfGow3cD8RVVYc1dCX2s0S1E/edit
пример: https://github.com/financialforcedev/fflib-apex-common-samplecode

P.S. Эти реализации по тем статьям, что Дима писал у себя в блоге.

К паттернам нельзя приучить, их нельзя зазубрить, их нужно прочувствовать. И пока этого не произойдёт, организм будет отвергать их как вирус. 
Кстати говоря, советую обратить внимание на это https://github.com/financialforcedev/fflib-apex-common + https://github.com/financialforcedev/fflib-apex-mocks (сори если повторяюсь, но вроде я на форуме не видел чтобы кто-то про это писал). В репах реализации UOW, обёртки над триггерами (triger handler) и казалось бы невозможные в Apex моки. Если следовать принципам, которые предлагают авторы совместно со статьями сала, то можно получить довольно независимую и прозрачную архитектуру Service, Domain, Selector. Есть примеры. Можем по обсуждать если заинтересовало. Особенно порадовал примитивный IOC контейнер :). С этим инструментом можно писать независимый код, который в паре с моками можно легко тестировать. DRY всем!

видео с DF: https://www.youtube.com/watch?v=qlq46AEAlLI
слайды к видео: https://docs.google.com/file/d/0B6brfGow3cD8RVVYc1dCX2s0S1E/edit
пример: https://github.com/financialforcedev/fflib-apex-common-samplecode

P.S. Эти реализации по тем статьям, что Дима писал у себя в блоге.

Дима Лисовский
Кстати говоря, советую обратить внимание на это https://github.com/financialforcedev/fflib-apex-common + https://github.com/financialforcedev/fflib-apex-mocks

Вот как раз эти все принципы и наработки активно используются в моем последнем проекте.
Против самих этих принципов я не против, но то во что они превращаются в итоге лучше не знать.
Типичный примеры
- сделать простой sidebar который можно встраивать в разные страницы - 4 класса 6 страниц.
- сделать фильтр чтобы со страницы передать параметры в SOQL - 3 класса.
По мне это ПЕРЕБОР!

[quote="Дима Лисовский"]Кстати говоря, советую обратить внимание на это https://github.com/financialforcedev/fflib-apex-common + https://github.com/financialforcedev/fflib-apex-mocks[/quote]
Вот как раз эти все принципы и наработки активно используются в моем последнем проекте.
Против самих этих принципов я не против, но то во что они превращаются в итоге лучше не знать.
Типичный примеры 
- сделать простой sidebar который можно встраивать в разные страницы - 4 класса 6 страниц.
- сделать фильтр чтобы со страницы передать параметры в SOQL - 3 класса.
По мне это ПЕРЕБОР!

Зато потом эти 4 класса и 6 страниц переносятся в другой проект не меняя ни строчки и не добавляя тестов
Это и есть DRY

Зато потом эти 4 класса и 6 страниц переносятся в другой проект не меняя ни строчки и не добавляя тестов
Это и есть DRY

Gres
При чем тут конкретный ЯП?

Действительно, ни при чем - ограничение Force.com плагина.

[quote="Gres"]При чем тут конкретный ЯП?[/quote]
Действительно, ни при чем - ограничение Force.com плагина.

Dmitry Shnyrev
По мне это ПЕРЕБОР!

Дима, не стоит бояться количества классов/страниц. В .net/java, в прочем и других технологиях вообще, новая логическая сущность - новый класс - новый файл. В итоге даже простые алгоритмы пишутся используя 5-6 интерфейсов + соответственно 5-6 классов, а то и больше если есть там фабрики или ещё что. Но это потом окупается, когда необходимо расширить функциональность, то дописывается ещё одна реализация, но сам основной код остаётся прежний (если конечно грамотная архитектура и изменения не совсем глобальные).
Вывод: количество классов не показатель сложности, гораздо сложнее методы, которые не влазят на экран монитора и названия переменных в один-три символа.
И ещё, очень трудно разбираться в коде, когда он > 500 строк и в методах активно юзается микс из переменных класса и аргументов, причём не обоснованно, например просто ради того, чтобы получить данные из формы. Такой код потом обычно тестируется созданием всего контекста страницы, заполняются странными значениями все паблик свойства и параметры класса-контроллера. Избавление от этого - чёткое разграничение ответственности методов, с предпосылкой на повторное использование в будущем, а именно - не делать в методах зависимости на члены класса-контроллера (если это не обоснованно), использовать DTO для входных и view model для входных данных. Так хоть более понятно, как взаимодействовать с классом. ИМХО.

[quote="Dmitry Shnyrev"]По мне это ПЕРЕБОР![/quote]
Дима, не стоит бояться количества классов/страниц. В .net/java, в прочем и других технологиях вообще, новая логическая сущность - новый класс - новый файл. В итоге даже простые алгоритмы пишутся используя 5-6 интерфейсов + соответственно 5-6 классов, а то и больше если есть там фабрики или ещё что. Но это потом окупается, когда необходимо расширить функциональность, то дописывается ещё одна реализация, но сам основной код остаётся прежний  (если конечно грамотная архитектура и изменения не совсем глобальные).
Вывод: количество классов не показатель сложности, гораздо сложнее методы, которые не влазят на экран монитора и названия переменных в один-три символа. 
И ещё, очень трудно разбираться в коде, когда он > 500 строк и в методах активно юзается микс из переменных класса и аргументов, причём не обоснованно, например просто ради того, чтобы получить данные из формы. Такой код потом обычно тестируется созданием всего контекста страницы, заполняются странными значениями все паблик свойства и параметры класса-контроллера. Избавление от этого - чёткое разграничение ответственности методов, с предпосылкой на повторное использование в будущем, а именно - не делать в методах зависимости на члены класса-контроллера (если это не обоснованно), использовать DTO для входных и view model для входных данных. Так хоть более понятно, как взаимодействовать с классом. ИМХО.

Все просто. Будет дальнейше расширенеи функционала - городи огород, нет - нет.
Тоже не хочется городить огород, если смысла в этом нет. "А вот, а вдруг надо будет". Надо будет, перепишем на огород. Когда понадобится.

Все просто. Будет дальнейше расширенеи функционала - городи огород, нет - нет.
Тоже не хочется городить огород, если смысла в этом нет. "А вот, а вдруг надо будет". Надо будет, перепишем на огород. Когда понадобится.

Chiz
Все просто. Будет дальнейше расширенеи функционала - городи огород, нет - нет.
Тоже не хочется городить огород, если смысла в этом нет. "А вот, а вдруг надо будет". Надо будет, перепишем на огород. Когда понадобится.

Зачастую очень сложно городить огород на прежних неплодородных развалинах. В таких случаях обычно всё переделывается с нуля, припоминая чью-то мать.

[quote="Chiz"]Все просто. Будет дальнейше расширенеи функционала - городи огород, нет - нет.
Тоже не хочется городить огород, если смысла в этом нет. "А вот, а вдруг надо будет". Надо будет, перепишем на огород. Когда понадобится.[/quote]
Зачастую очень сложно городить огород на прежних неплодородных развалинах. В таких случаях обычно всё переделывается с нуля, припоминая чью-то мать.

А не надо на прежних. Новый огород, в который переносишь логику из "развалин" и все работает дальше.
За 4 года я такое делал всего два раза. Из-за одного случая в два года каждый раз городить огород - ну это же перебор. Вместо задачи на 4 часа, она выходит на 8-10, только из-за красивого огорода на будущее. А птм, через год вспоминай, зачем каждая грядка в этом огороде. Еще плюс 4 часа.
У каждого свои задачи.

А не надо на прежних. Новый огород, в который переносишь логику из "развалин" и все работает дальше.
За 4 года я такое делал всего два раза. Из-за одного случая в два года каждый раз городить огород - ну это же перебор. Вместо задачи на 4 часа, она выходит на 8-10, только из-за красивого огорода на будущее. А птм, через год вспоминай, зачем каждая грядка в этом огороде. Еще плюс 4 часа.
У каждого свои задачи.

Дима Лисовский
Кстати говоря, советую обратить внимание на это https://github.com/financialforcedev/fflib-apex-common + https://github.com/financialforcedev/fflib-apex-mocks

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

[quote="Дима Лисовский"]Кстати говоря, советую обратить внимание на это https://github.com/financialforcedev/fflib-apex-common + https://github.com/financialforcedev/fflib-apex-mocks[/quote]
Так про это уже здесь писали что если компания может позволить себе такой ресурс как больше времени для входа нового разроботчика в проект тогда, да можно использовать или зависит на сколько этот проект будет расширяем в будущем. 


Кстати, да.
Я вот как единственный, кто занимается СФ частью, знаю, где мне надо сделать компактно и быстро, а где с возможностью роста. Я знаю приложения, кот используют мой код и знаю, где потенциально пользователи могут попросить расширение. Я сам думаю о том, огород мне нужен или один горшочек.
Если есть отдельный Архитектор, то он общается с товарищами, которые задают тон приложению и они знают, где будет расширение в будущем.

Кстати, да.
Я вот как единственный, кто занимается СФ частью, знаю, где мне надо сделать компактно и быстро, а где с возможностью роста. Я знаю приложения, кот используют мой код и знаю, где потенциально пользователи могут попросить расширение. Я сам думаю о том, огород мне нужен или один горшочек.
Если есть отдельный Архитектор, то он общается с товарищами, которые задают тон приложению и они знают, где будет расширение в будущем.

Дима Лисовский
К паттернам нельзя приучить, их нельзя зазубрить, их нужно прочувствовать. И пока этого не произойдёт, организм будет отвергать их как вирус.
Кстати говоря, советую обратить внимание на это https://github.com/financialforcedev/fflib-apex-common + https://github.com/financialforcedev/fflib-apex-mocks (сори если повторяюсь, но вроде я на форуме не видел чтобы кто-то про это писал). В репах реализации UOW, обёртки над триггерами (triger handler) и казалось бы невозможные в Apex моки. Если следовать принципам, которые предлагают авторы совместно со статьями сала, то можно получить довольно независимую и прозрачную архитектуру Service, Domain, Selector. Есть примеры. Можем по обсуждать если заинтересовало. Особенно порадовал примитивный IOC контейнер :). С этим инструментом можно писать независимый код, который в паре с моками можно легко тестировать. DRY всем!

видео с DF: https://www.youtube.com/watch?v=qlq46AEAlLI
слайды к видео: https://docs.google.com/file/d/0B6brfGow3cD8RVVYc1dCX2s0S1E/edit
пример: https://github.com/financialforcedev/fflib-apex-common-samplecode

P.S. Эти реализации по тем статьям, что Дима писал у себя в блоге.


Хоть кто-то меня понимает и поддерживает.
Кст. там не все так хорошо. Можем обсудить. =)

[quote="Дима Лисовский"]К паттернам нельзя приучить, их нельзя зазубрить, их нужно прочувствовать. И пока этого не произойдёт, организм будет отвергать их как вирус. 
Кстати говоря, советую обратить внимание на это https://github.com/financialforcedev/fflib-apex-common + https://github.com/financialforcedev/fflib-apex-mocks (сори если повторяюсь, но вроде я на форуме не видел чтобы кто-то про это писал). В репах реализации UOW, обёртки над триггерами (triger handler) и казалось бы невозможные в Apex моки. Если следовать принципам, которые предлагают авторы совместно со статьями сала, то можно получить довольно независимую и прозрачную архитектуру Service, Domain, Selector. Есть примеры. Можем по обсуждать если заинтересовало. Особенно порадовал примитивный IOC контейнер :). С этим инструментом можно писать независимый код, который в паре с моками можно легко тестировать. DRY всем!

видео с DF: https://www.youtube.com/watch?v=qlq46AEAlLI
слайды к видео: https://docs.google.com/file/d/0B6brfGow3cD8RVVYc1dCX2s0S1E/edit
пример: https://github.com/financialforcedev/fflib-apex-common-samplecode

P.S. Эти реализации по тем статьям, что Дима писал у себя в блоге.[/quote]
Хоть кто-то меня понимает и поддерживает.
Кст. там не все так хорошо. Можем обсудить. =)

Chiz
Вместо задачи на 4 часа, она выходит на 8-10

У меня не уходит на архитектуру больше времени. Что я делаю не так?
А, да, наверно, она похожа на архитектуру предыдущего проекта и я могу ее просто перенести.

[quote="Chiz"]Вместо задачи на 4 часа, она выходит на 8-10[/quote]
У меня не уходит на архитектуру больше времени. Что я делаю не так?
А, да, наверно, она похожа на архитектуру предыдущего проекта и я могу ее просто перенести.

Dmitry Shnyrev
Дима Лисовский
Кстати говоря, советую обратить внимание на это https://github.com/financialforcedev/fflib-apex-common + https://github.com/financialforcedev/fflib-apex-mocks

Вот как раз эти все принципы и наработки активно используются в моем последнем проекте.
Против самих этих принципов я не против, но то во что они превращаются в итоге лучше не знать.
Типичный примеры
- сделать простой sidebar который можно встраивать в разные страницы - 4 класса 6 страниц.
- сделать фильтр чтобы со страницы передать параметры в SOQL - 3 класса.
По мне это ПЕРЕБОР!

Новая еденица измерения кода - класс. =)

[quote="Dmitry Shnyrev"][quote="Дима Лисовский"]Кстати говоря, советую обратить внимание на это https://github.com/financialforcedev/fflib-apex-common + https://github.com/financialforcedev/fflib-apex-mocks[/quote]
Вот как раз эти все принципы и наработки активно используются в моем последнем проекте.
Против самих этих принципов я не против, но то во что они превращаются в итоге лучше не знать.
Типичный примеры 
- сделать простой sidebar который можно встраивать в разные страницы - 4 класса 6 страниц.
- сделать фильтр чтобы со страницы передать параметры в SOQL - 3 класса.
По мне это ПЕРЕБОР![/quote]
Новая еденица измерения кода - класс. =)

Chiz
Все просто. Будет дальнейше расширенеи функционала - городи огород, нет - нет.
Тоже не хочется городить огород, если смысла в этом нет. "А вот, а вдруг надо будет". Надо будет, перепишем на огород. Когда понадобится.

А при старте проекта ты никогда не узнаешь насколько большим он будет.
На переписывание уйдет N^2 времени.

[quote="Chiz"]Все просто. Будет дальнейше расширенеи функционала - городи огород, нет - нет.
Тоже не хочется городить огород, если смысла в этом нет. "А вот, а вдруг надо будет". Надо будет, перепишем на огород. Когда понадобится.[/quote]
А при старте проекта ты никогда не узнаешь насколько большим он будет.
На переписывание уйдет N^2 времени.

Sergey Prichepo
Так про это уже здесь писали что если компания может позволить себе такой ресурс как больше времени для входа нового разроботчика в проект тогда, да можно использовать

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

[quote="Sergey Prichepo"]Так про это уже здесь писали что если компания может позволить себе такой ресурс как больше времени для входа нового разроботчика в проект тогда, да можно использовать[/quote]
Время входа в проект, где каждый класс 2к строк намного больше, чем в проект с четкой и понятно описанной архитектурой.

Chiz
Я вот как единственный, кто занимается СФ частью, знаю, где мне надо сделать компактно и быстро, а где с возможностью роста. Я знаю приложения, кот используют мой код и знаю, где потенциально пользователи могут попросить расширение. Я сам думаю о том, огород мне нужен или один горшочек.

Суть в том, что твой код придется кому-нибудь поддерживать и расширять.

[quote="Chiz"]Я вот как единственный, кто занимается СФ частью, знаю, где мне надо сделать компактно и быстро, а где с возможностью роста. Я знаю приложения, кот используют мой код и знаю, где потенциально пользователи могут попросить расширение. Я сам думаю о том, огород мне нужен или один горшочек. [/quote]
Суть в том, что твой код придется кому-нибудь поддерживать и расширять.

Дима, зря ты эту тему поднял. =)

Дима, зря ты эту тему поднял. =)

Gres
Дима, зря ты эту тему поднял. =)

Я же говорю вирус)

[quote="Gres"]Дима, зря ты эту тему поднял. =)[/quote]

Я же говорю вирус)

Gres
У меня не уходит на архитектуру больше времени. Что я делаю не так?
А, да, наверно, она похожа на архитектуру предыдущего проекта и я могу ее просто перенести.

У меня не получатся "просто" перенести. Только сложно, ибо проекты разные, и как минимум, классы используются разные.
Gres
А при старте проекта ты никогда не узнаешь насколько большим он будет.

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

В моем конкретном случае я делаю либо новый функционал, который связан с существующим, но никак не пересекается в плане кода; либо добавить поля, что как бы тоже не супер расширение функционала, трубующее огородов.

Кстати. Надо посмотреть те ссылки :-) А то вдруг там совсем не огороды, а я тут рассказываю :-)

[quote="Gres"]У меня не уходит на архитектуру больше времени. Что я делаю не так?
А, да, наверно, она похожа на архитектуру предыдущего проекта и я могу ее просто перенести.[/quote]
У меня не получатся "просто" перенести. Только сложно, ибо проекты разные, и как минимум, классы используются разные.
[quote="Gres"]А при старте проекта ты никогда не узнаешь насколько большим он будет. [/quote]
Нет. Но перед тем, как начинать думать над архитектурой, в голове складывается мнение о том, нужен огород или нет. Ты для себя (или кто-то вместо тебя) решаешь, с или без задела на будущее.

В моем конкретном случае я делаю либо новый функционал, который связан с существующим, но никак не пересекается в плане кода; либо добавить поля, что как бы тоже не супер расширение функционала, трубующее огородов.

Кстати. Надо посмотреть те ссылки :-) А то вдруг там совсем не огороды, а я тут рассказываю :-)

Gres
Кст. там не все так хорошо. Можем обсудить. =)

Ну я исходники особо не смотрел UOW только немного смотрел, так как важен был порядок DML по логике, в итоге от него пришлось отказаться, хотя ничего не мешало дописать возможность конфигурирования кастомного порядка DML, на будущее пригодилось бы, да просто времени не было.

А что там криво сделано, не оптимально что-то?

[quote="Gres"]Кст. там не все так хорошо. Можем обсудить. =)[/quote]

Ну я исходники особо не смотрел UOW только немного смотрел, так как важен был порядок DML по логике, в итоге от него пришлось отказаться, хотя ничего не мешало дописать возможность конфигурирования кастомного порядка DML, на будущее пригодилось бы, да просто времени не было.

А что там криво сделано, не оптимально что-то?

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

Не, так не честно.
У меня был проект с двумя классами по 2к строк и там было два метода - один конструктор, другой на 1999 строк :-) Все там было ясно - куча if...else
Сейчас тоже один на 2к - куча статических методов для вычитывания и оборачивания объектов для сервисов. Четко и понятно - методы вычитывания и классы-обертки. Че там въезжать, ищи метод по нужному классу.

Я как-то собеседовался в компанию, которая пилила свое продукт в AppExchange - мне предложили на $400 меньше, чем я просил - видимо, я не пригоден к тру энтэрпрайз. И от Теленора я ушел, ибо их махины меня не впечатлили с кучей прослоек и корпоративной культурой.

[quote="Gres"]Время входа в проект, где каждый класс 2к строк намного больше, чем в проект с четкой и понятно описанной архитектурой.[/quote]
Не, так не честно.
У меня был проект с двумя классами по 2к строк и там было два метода - один конструктор, другой на 1999 строк :-) Все там было ясно - куча if...else
Сейчас тоже один на 2к - куча статических методов для вычитывания и оборачивания объектов для сервисов. Четко и понятно - методы вычитывания и классы-обертки. Че там въезжать, ищи метод по нужному классу.

Я как-то собеседовался в компанию, которая пилила свое продукт в AppExchange - мне предложили на $400 меньше, чем я просил - видимо, я не пригоден к тру энтэрпрайз. И от Теленора я ушел, ибо их махины меня не впечатлили с кучей прослоек и корпоративной культурой.

Chiz
У меня был проект с двумя классами по 2к строк и там было два метода - один конструктор, другой на 1999 строк :-) Все там было ясно - куча if...else

Неет, не пишите такой код никогда, поберегите коллег.

[quote="Chiz"]У меня был проект с двумя классами по 2к строк и там было два метода - один конструктор, другой на 1999 строк :-) Все там было ясно - куча if...else [/quote]

Неет, не пишите такой код никогда, поберегите коллег.

Дима Лисовский
Chiz
У меня был проект с двумя классами по 2к строк и там было два метода - один конструктор, другой на 1999 строк :-) Все там было ясно - куча if...else

Неет, не пишите такой код никогда, поберегите коллег.


у меня счас идет вызов helper класса для методов 4K его MVP написал.

[quote="Дима Лисовский"][quote="Chiz"]У меня был проект с двумя классами по 2к строк и там было два метода - один конструктор, другой на 1999 строк :-) Все там было ясно - куча if...else [/quote]

Неет, не пишите такой код никогда, поберегите коллег.[/quote]
у меня счас идет вызов helper класса для методов 4K его MVP написал.

Дима Лисовский
Chiz
У меня был проект с двумя классами по 2к строк и там было два метода - один конструктор, другой на 1999 строк :-) Все там было ясно - куча if...else

Неет, не пишите такой код никогда, поберегите коллег.


Хм, а как можно по-другому?

Boolean flag1 = sObj1.f2__c;
String xml = '';
if (sObj1__c.f1__c == '1') {
xml += '<f1>1</f1>';
} else if (sObj1__c.f1__c == '2' && flag1) {
xml += '<f1 flag1="true">2<f1>;
} else {
// error handling
}
// next fields

Каким образом я тут могу if..else обойти?

[quote="Дима Лисовский"][quote="Chiz"]У меня был проект с двумя классами по 2к строк и там было два метода - один конструктор, другой на 1999 строк :-) Все там было ясно - куча if...else [/quote]

Неет, не пишите такой код никогда, поберегите коллег.[/quote]
Хм, а как можно по-другому?

[quote]Boolean flag1 = sObj1.f2__c;
String xml = '';
if (sObj1__c.f1__c == '1') {
 xml += '<f1>1</f1>';
} else if (sObj1__c.f1__c == '2' && flag1) {
 xml += '<f1 flag1="true">2<f1>;
} else {
 // error handling
}
// next fields[/quote]

Каким образом я тут могу if..else обойти?

Chiz
Каким образом я тут могу if..else обойти?

Огородом)
Сложно сказать как, не имея представления о задаче, так как решение основывается на условиях, а не на вырванном фрагменте.

[quote="Chiz"]Каким образом я тут могу if..else обойти?[/quote]
Огородом)
Сложно сказать как, не имея представления о задаче, так как решение основывается на условиях, а не на вырванном фрагменте.

Sergey Prichepo
у меня счас идет вызов helper класса для методов 4K его MVP написал.

Цэ пэрэмога :-)
Мне после очередного добавленного метода ревьверы сказали хватит :-) Давай в отдельные классы для отдельных объектов. Ужеж я сам себе хозяин - делай нормально, а не как повелось. Вот, делаю задачу какую, заодно немного разношу. Он уже не 2к, а 1,5к. Я работаю над собой :-)

[quote="Sergey Prichepo"]у меня счас идет вызов helper класса для методов 4K его MVP написал.[/quote]
Цэ пэрэмога :-)
Мне после очередного добавленного метода ревьверы сказали хватит :-) Давай в отдельные классы для отдельных объектов. Ужеж я сам себе хозяин - делай нормально, а не как повелось. Вот, делаю задачу какую, заодно немного разношу. Он уже не 2к, а 1,5к. Я работаю над собой :-)

Sergey Prichepo
его MVP написал

Ну это не значит что метод из 4к строк это гуд.

[quote="Sergey Prichepo"]его MVP написал[/quote]
Ну это не значит что метод из 4к строк это гуд.

Дима Лисовский
Chiz
Каким образом я тут могу if..else обойти?

Огородом)
Сложно сказать как, не имея представления о задаче, так как решение основывается на условиях, а не на вырванном фрагменте.

Задача простая - из пары объектов, связанных между собой по-разному, в зависимости от флагов/полей, собирается xml, кот птм отправляется в плавание куда-то. Вот такой сбор xml и был раскатан в 2к строк.

[quote="Дима Лисовский"][quote="Chiz"]Каким образом я тут могу if..else обойти?[/quote]
Огородом)
Сложно сказать как, не имея представления о задаче, так как решение основывается на условиях, а не на вырванном фрагменте.[/quote]
Задача простая - из пары объектов, связанных между собой по-разному, в зависимости от флагов/полей, собирается xml, кот птм отправляется в плавание куда-то. Вот такой сбор xml и был раскатан в 2к строк.

Chiz
Мне после очередного добавленного метода ревьверы сказали хватит :-) Давай в отдельные классы для отдельных объектов. Ужеж я сам себе хозяин - делай нормально, а не как повелось. Вот, делаю задачу какую, заодно немного разношу. Он уже не 2к, а 1,5к. Я работаю над собой :-)

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

[quote="Chiz"]Мне после очередного добавленного метода ревьверы сказали хватит :-) Давай в отдельные классы для отдельных объектов. Ужеж я сам себе хозяин - делай нормально, а не как повелось. Вот, делаю задачу какую, заодно немного разношу. Он уже не 2к, а 1,5к. Я работаю над собой :-)[/quote]

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

Chiz
Задача простая - из пары объектов, связанных между собой по-разному, в зависимости от флагов/полей, собирается xml, кот птм отправляется в плавание куда-то. Вот такой сбор xml и был раскатан в 2к строк.

ну тут логично разделить на поиск и формирование + методы доступа к xml вынести, что бы можно потом использовать, в других местах. Вдруг завтра придут к тебе и скажут, "не, получать будем в JSON". И ты давай всё переписывать, а будь у тебя логическое разделение, ты бы подставил другую реализацию поиска, а код формирования прежний, оттестированный. Профит)

[quote="Chiz"]Задача простая - из пары объектов, связанных между собой по-разному, в зависимости от флагов/полей, собирается xml, кот птм отправляется в плавание куда-то. Вот такой сбор xml и был раскатан в 2к строк.[/quote]

ну тут логично разделить на поиск и формирование + методы доступа к xml вынести, что бы можно потом использовать, в других местах. Вдруг завтра придут к тебе и скажут, "не, получать будем в JSON". И ты давай всё переписывать, а будь у тебя логическое разделение, ты бы подставил другую реализацию поиска, а код формирования прежний, оттестированный. Профит)

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

Чисто по логическим и разносится - в REST класс выносится метод вычитывания объекта из СФ и обертка. Я не знаю, ускорит это обработку запросов из вне, но чисто для меня, не писать перед классом и методом название "статического всеводномклассе" класса уже плюс :-)

[quote="Дима Лисовский"]Не нужно решать такую проблем просто "разрезанием" метода на куски, нужно стараться находить те части, которые относятся к одной логической операции и которые могут в дальнейшем применяться в других местах, не зависимо от контекста. Меньше зависимостей - меньше проблем.[/quote]
Чисто по логическим и разносится - в REST класс выносится метод вычитывания объекта из СФ и обертка. Я не знаю, ускорит это обработку запросов из вне, но чисто для меня, не писать перед классом и методом название "статического всеводномклассе" класса уже плюс :-)

Chiz
чисто для меня, не писать перед классом и методом название "статического всеводномклассе" класса уже плюс :-)

Видимо такие лентяи и пишут методы по 2к строк)

P.S. Ничего личного.

[quote="Chiz"]чисто для меня, не писать перед классом и методом название "статического всеводномклассе" класса уже плюс :-)[/quote]
Видимо такие лентяи и пишут методы по 2к строк) 

P.S. Ничего личного.

Дима Лисовский
ну тут логично разделить на поиск и формирование + методы доступа к xml вынести, что бы можно потом использовать, в других местах. Вдруг завтра придут к тебе и скажут, "не, получать будем в JSON". И ты давай всё переписывать, а будь у тебя логическое разделение, ты бы подставил другую реализацию поиска, а код формирования прежний, оттестированный. Профит)

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

[quote="Дима Лисовский"]ну тут логично разделить на поиск и формирование + методы доступа к xml вынести, что бы можно потом использовать, в других местах. Вдруг завтра придут к тебе и скажут, "не, получать будем в JSON". И ты давай всё переписывать, а будь у тебя логическое разделение, ты бы подставил другую реализацию поиска, а код формирования прежний, оттестированный. Профит)[/quote]
За пол года работы на том проекте, я добавлял только новые условия или менял уже существующий. Так что переписывать мне ничго не надо было, а только знай, добавляй тесты на новый функционал.

Дима Лисовский
Видимо такие лентяи и пишут методы по 2к строк)

Ну, городить
Дима Лисовский
Видимо такие лентяи и пишут методы по 2к строк)

Мне действительно лень городить огород, который птм фиг отдебажишь в Eclipse. Я уже городил - не понравилось, больно :-)

[quote="Дима Лисовский"]Видимо такие лентяи и пишут методы по 2к строк) [/quote]
Ну, городить [quote="Дима Лисовский"]Видимо такие лентяи и пишут методы по 2к строк) [/quote]
Мне действительно лень городить огород, который птм фиг отдебажишь в Eclipse. Я уже городил - не понравилось, больно :-)


тема - огонь!)
развели тут земельное хозяйство

[size=50]
тема - огонь!)
развели тут земельное хозяйство
[/size]

Chiz
Сейчас тоже один на 2к - куча статических методов для вычитывания и оборачивания объектов для сервисов. Четко и понятно - методы вычитывания и классы-обертки. Че там въезжать, ищи метод по нужному классу.

Какая красота! Идеал!

[quote="Chiz"]Сейчас тоже один на 2к - куча статических методов для вычитывания и оборачивания объектов для сервисов. Четко и понятно - методы вычитывания и классы-обертки. Че там въезжать, ищи метод по нужному классу.[/quote]
Какая красота! Идеал! :D 

Дима Лисовский
Видимо такие лентяи и пишут методы по 2к строк)
P.S. Ничего личного.

А за такой подход. Зоопарк из кучи классов не люблю.
Вся бизнес логика (естественно логически связанная) в один класс с набором статических методов.

[quote="Дима Лисовский"]
Видимо такие лентяи и пишут методы по 2к строк)
P.S. Ничего личного.[/quote]
А за такой подход. Зоопарк из кучи классов не люблю.
Вся бизнес логика (естественно логически связанная) в один класс с набором статических методов.

Как я вижу идеальную структуру:
например логика связанная с Payment:
- N страниц с контроллерами
- 1 PaymentService c кучей статических методов и набором DTO (классы обертки) там же.
- 1 тест класс
ВСЁ! Зачем больше.
Не знаю что это за подход, возможно он больше подходит под определение функцонального программирования.
Зато все в одном месте, программист варится с свой маленькой песочницы, ни от кого не зависит. И не надо держать 100500 вкладок в IDE и вспоминать где что и за что отвечает.

Как я вижу идеальную структуру:
например логика связанная с Payment:
- N страниц с контроллерами
- 1 PaymentService c кучей статических методов и набором DTO (классы обертки) там же.
- 1 тест класс
ВСЁ! Зачем больше.
Не знаю что это за подход, возможно он больше подходит под определение функцонального программирования.
Зато все в одном месте, программист варится с свой маленькой песочницы, ни от кого не зависит. И не надо держать 100500 вкладок в IDE и вспоминать где что и за что отвечает.

Дима Лисовский
Видимо такие лентяи и пишут методы по 2к строк)

Если честно. За годы работы в ВРП, все проекты, что я видел были именно такими.
Был один новый проект, на котором один сеньер-помидор-девелопер ввел паттерны. Но помоему после полугода использования этих паттернов, он же и переписал все в человеческий вид, ибо даже он сам не смог их поддержать, поэтому что все его трудозатраты были безсмысленными. Он действительно нагородил кучу всего, и вроде бы да, можно сказать - еб@ть как у вас тут все красиво, с паттернами, а зачем это надо, если можно было запилить один класс, который бы делал все тоже самое, это заняло бы меньше времени, маштабировалось бы, тоже быстро? Ответ: ну потому, что это высший класс, это же паттерны...

Опять же, я не говорю, что не надо использовать паттерны и прочие ООП штуки, я говорю, что их надо использовать там, где это действительно нужно, а не потому что это круто.

[quote="Дима Лисовский"]Видимо такие лентяи и пишут методы по 2к строк)[/quote]

Если честно. За годы работы в ВРП, все проекты, что я видел были именно такими.
Был один новый проект, на котором один сеньер-помидор-девелопер ввел паттерны. Но помоему после полугода использования этих паттернов, он же и переписал все в человеческий вид, ибо даже он сам не смог их поддержать, поэтому что все его трудозатраты были безсмысленными. Он действительно нагородил кучу всего, и вроде бы да, можно сказать - еб@ть как у вас тут все красиво, с паттернами, а  зачем это надо, если можно было запилить один класс, который бы делал все тоже самое, это заняло бы меньше времени, маштабировалось бы, тоже быстро? Ответ: ну потому, что это высший класс, это же паттерны...

Опять же, я не говорю, что не надо использовать паттерны и прочие ООП штуки, я говорю, что их надо использовать там, где это действительно нужно, а не потому что это круто.

Sergey Prichepo
у меня счас идет вызов helper класса для методов 4K его MVP написал.

И что тогда мы можем сказать об MVP?

[quote="Sergey Prichepo"]у меня счас идет вызов helper класса для методов 4K его MVP написал.[/quote]
И что тогда мы можем сказать об MVP?

Maxim Elets
Был один новый проект, на котором один сеньер-помидор-девелопер ввел паттерны. Но помоему после полугода использования этих паттернов, он же и переписал все в человеческий вид, ибо даже он сам не смог их поддержать, поэтому что все его трудозатраты были безсмысленными. Он действительно нагородил кучу всего, и вроде бы да, можно сказать - еб@ть как у вас тут все красиво, с паттернами, а зачем это надо, если можно было запилить один класс, который бы делал все тоже самое, это заняло бы меньше времени, маштабировалось бы, тоже быстро? Ответ: ну потому, что это высший класс, это же паттерны...

Итог, архитектурой должен заниматься архитектор или технический лидер, у которого достаточно опыта.

[quote="Maxim Elets"]Был один новый проект, на котором один сеньер-помидор-девелопер ввел паттерны. Но помоему после полугода использования этих паттернов, он же и переписал все в человеческий вид, ибо даже он сам не смог их поддержать, поэтому что все его трудозатраты были безсмысленными. Он действительно нагородил кучу всего, и вроде бы да, можно сказать - еб@ть как у вас тут все красиво, с паттернами, а зачем это надо, если можно было запилить один класс, который бы делал все тоже самое, это заняло бы меньше времени, маштабировалось бы, тоже быстро? Ответ: ну потому, что это высший класс, это же паттерны...[/quote]
Итог, архитектурой должен заниматься архитектор или технический лидер, у которого достаточно опыта.

Maxim Elets
Опять же, я не говорю, что не надо использовать паттерны и прочие ООП штуки, я говорю, что их надо использовать там, где это действительно нужно, а не потому что это круто.

Кто сказал, что это круто?
Лично для меня это просто удобно.

[quote="Maxim Elets"]Опять же, я не говорю, что не надо использовать паттерны и прочие ООП штуки, я говорю, что их надо использовать там, где это действительно нужно, а не потому что это круто.[/quote]
Кто сказал, что это круто?
Лично для меня это просто удобно.

И запомните самое главное - вы пишете код для людей!

[size=100]И запомните самое главное - вы пишете код для людей![/size]

Gres
вы пишете код для людей

которые никогда внутренностей не увидят, Ы))

[quote="Gres"]вы пишете код для людей[/quote]
которые никогда внутренностей не увидят, Ы))

Dmitry Shnyrev
Не знаю что это за подход, возможно он больше подходит под определение функцонального программирования.

Во, как это называется :-) Вот как зовут мою любовь :-)

[quote="Dmitry Shnyrev"]Не знаю что это за подход, возможно он больше подходит под определение функцонального программирования. [/quote]
Во, как это называется :-) Вот как зовут мою любовь :-)

Gres
И запомните самое главное - вы пишете код для людей!

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

[quote="Gres"]И запомните самое главное - вы пишете код для людей![/quote]
Мне, кстати, как-то так получилось, все начальники грили, что первое - это функционал для конечного пользователя без багов. Легко тебе такой код написать или сложно, как и с помощью чего - это второстепенные вещи. Главное - решить задачи конечного пользователя, все остальное вторично.

Maxim Elets
которые никогда внутренностей не увидят, Ы))

Люди == программисты

[quote="Maxim Elets"]которые никогда внутренностей не увидят, Ы))[/quote]
Люди == программисты

Честно говоря у меня просто пригорело от темы, я даже пароль забыл.
Метод в 2к строчек (в 1к строчек) это ВСЕГДА ненормально.
Если кто-то считает, что я не прав желаю ему попасть на чей-то легаси код в таком стиле.
И, например, неделю на добавление какой-то серьезной фичи в "это".

Честно говоря у меня просто пригорело от темы, я даже пароль забыл.
Метод в 2к строчек (в 1к строчек) это ВСЕГДА ненормально.
Если кто-то считает, что я не прав желаю ему попасть на чей-то легаси код в таком стиле.
И, например, неделю на добавление какой-то серьезной фичи в "это".

RasMisha
Честно говоря у меня просто пригорело от темы, я даже пароль забыл.
Метод в 2к строчек (в 1к строчек) это ВСЕГДА ненормально.
Если кто-то считает, что я не прав желаю ему попасть на чей-то легаси код в таком стиле.
И, например, неделю на добавление какой-то серьезной фичи в "это".

Попадал. Два раза. Первый раз было больно. Второй - было уже симпатичней. Ничего в этом такого нет.

[quote="RasMisha"]Честно говоря у меня просто пригорело от темы, я даже пароль забыл.
Метод в 2к строчек (в 1к строчек) это ВСЕГДА ненормально.
Если кто-то считает, что я не прав желаю ему попасть на чей-то легаси код в таком стиле.
И, например, неделю на добавление какой-то серьезной фичи в "это".[/quote]
Попадал. Два раза. Первый раз было больно. Второй - было уже симпатичней. Ничего в этом такого нет.

Chiz
Попадал. Два раза. Первый раз было больно. Второй - было уже симпатичней. Ничего в этом такого нет.

А можно поподробнее, что надо было сделать и за какое время?
А вообще кроме ненависти такой код ничего не вызывает.
Такое ощущение, что люди делают проекты на отшибись)

[quote="Chiz"]Попадал. Два раза. Первый раз было больно. Второй - было уже симпатичней. Ничего в этом такого нет.[/quote]
А можно поподробнее, что надо было сделать и за какое время?
А вообще кроме ненависти такой код ничего не вызывает.
Такое ощущение, что люди делают проекты на отшибись)

RasMisha
Chiz
Попадал. Два раза. Первый раз было больно. Второй - было уже симпатичней. Ничего в этом такого нет.

А можно поподробнее, что надо было сделать и за какое время?
А вообще кроме ненависти такой код ничего не вызывает.
Такое ощущение, что люди делают проекты на отшибись)

В первом случае класс создающий xml, кот птм отправляется во внешнее плавание. Изменять параметры if...else и подставлять новые/другие значения. Все просто. Сказали вместо значения А1 при параметрах Б1 и Б2 надо теперь подставлять В3. Или. Уже существующее значение должно в довесок к существующей логике обработать новое поле Г4. Ищется поле или значение в этом 2к классе и правится за 5 минут. Ковыряется тест в течении часов 2х и прогонка всего остального. Тестирование ручками.
Второе. Обычно добавить новое поле в класс-обертку. Добавить новое поле в класс-обертку, в SOQL, проставить значение в обертке из объекта, может, добавить какую логику. Прогнать тесты. Добавить новое поле в паре SOQL где-то там еще. Тесты. Ручками.
Время не ограничивается - чем быстрей, тем лучше.

[quote="RasMisha"][quote="Chiz"]Попадал. Два раза. Первый раз было больно. Второй - было уже симпатичней. Ничего в этом такого нет.[/quote]
А можно поподробнее, что надо было сделать и за какое время?
А вообще кроме ненависти такой код ничего не вызывает.
Такое ощущение, что люди делают проекты на отшибись)[/quote]
В первом случае класс создающий xml, кот птм отправляется во внешнее плавание. Изменять параметры if...else и подставлять новые/другие значения. Все просто. Сказали вместо значения А1 при параметрах Б1 и Б2 надо теперь подставлять В3. Или. Уже существующее значение должно в довесок к существующей логике обработать новое поле Г4. Ищется поле или значение в этом 2к классе и правится за 5 минут. Ковыряется тест в течении часов 2х и прогонка всего остального. Тестирование ручками.
Второе. Обычно добавить новое поле в класс-обертку. Добавить новое поле в класс-обертку, в SOQL, проставить значение в обертке из объекта, может, добавить какую логику. Прогнать тесты. Добавить новое поле в паре SOQL где-то там еще. Тесты. Ручками.
Время не ограничивается - чем быстрей, тем лучше.

'Manual Test' Driven Development (ссори, если накосячил с английским, гг)
Что еще за тесты ручками? Как там с регрессией?

А если полностью структуру запроса надо поменять?
Или, например, сделать всё не в один веб-запрос, а в 101? (частями ответы шлёт сервер, например).

Ну вообще добавление поля, которое ни на что не влияет это еще полдела, а если из-за этого поля появляется логика влияющия, внезапно, на всю остальную логику (в 2к строчках)?

'Manual Test' Driven Development (ссори, если накосячил с английским, гг)
Что еще за тесты ручками? Как там с регрессией?

А если полностью структуру запроса надо поменять?
Или, например, сделать всё не в один веб-запрос, а в 101? (частями ответы шлёт сервер, например).

Ну вообще добавление поля, которое ни на что не влияет это еще полдела, а если из-за этого поля появляется логика влияющия, внезапно, на всю остальную логику (в 2к строчках)?

RasMisha
'Manual Test' Driven Development (ссори, если накосячил с английским, гг)
Что еще за тесты ручками? Как там с регрессией?

Проделать все те действия, кот делают конечные пользователи.
RasMisha
А если полностью структуру запроса надо поменять?
Или, например, сделать всё не в один веб-запрос, а в 101? (частями ответы шлёт сервер, например).

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

Я бы добавил флаг.

[quote="RasMisha"]'Manual Test' Driven Development (ссори, если накосячил с английским, гг)
Что еще за тесты ручками? Как там с регрессией?[/quote]
Проделать все те действия, кот делают конечные пользователи.
[quote="RasMisha"]
А если полностью структуру запроса надо поменять?
Или, например, сделать всё не в один веб-запрос, а в 101? (частями ответы шлёт сервер, например).[/quote]
Тогда ж**а, которой ни разу не было. В первом случае за пол года, во втором за год.
[quote="RasMisha"]
Ну вообще добавление поля, которое ни на что не влияет это еще полдела, а если из-за этого поля появляется логика влияющия, внезапно, на всю остальную логику (в 2к строчках)?[/quote]
Я бы добавил флаг.

Добавил флаг?
Я так и вспоминаю проект
if (cloneMode) { ... }
else if (copyMode) { ... }
else if (createMode) { ... }
и тд

и в каждом блоке 100500 строк

Добавил флаг?
Я так и вспоминаю проект
if (cloneMode) { ... }
else if (copyMode) { ... }
else if (createMode) { ... }
и тд

и в каждом блоке 100500 строк

RasMisha
Добавил флаг?
Я так и вспоминаю проект
if (cloneMode) { ... }
else if (copyMode) { ... }
else if (createMode) { ... }
и тд

и в каждом блоке 100500 строк


В моем случае было всего по одной-две строчки.

[quote="RasMisha"]Добавил флаг?
Я так и вспоминаю проект
if (cloneMode) { ... }
else if (copyMode) { ... }
else if (createMode) { ... }
и тд

и в каждом блоке 100500 строк[/quote]
В моем случае было всего по одной-две строчки.

RasMisha
if (cloneMode) { ... }
else if (copyMode) { ... }
else if (createMode) { ... }

так а что в bool плохого? кроме 100500 строк?

[quote="RasMisha"]if (cloneMode) { ... } 
else if (copyMode) { ... } 
else if (createMode) { ... } 
[/quote]
так а что в bool плохого? кроме 100500 строк?

Maxim Elets
RasMisha
if (cloneMode) { ... }
else if (copyMode) { ... }
else if (createMode) { ... }

так а что в bool плохого? кроме 100500 строк?

То, что существует полиморфизм! =)

[quote="Maxim Elets"][quote="RasMisha"]if (cloneMode) { ... } 
else if (copyMode) { ... } 
else if (createMode) { ... } 
[/quote]
так а что в bool плохого? кроме 100500 строк?[/quote]
То, что существует полиморфизм! =)

Maxim Elets
так а что в bool плохого? кроме 100500 строк?

Присоединяюсь к Gres
Ну и сами подумайте, многое там отличалось в этих блоках?)

[quote="Maxim Elets"]так а что в bool плохого? кроме 100500 строк?[/quote]
Присоединяюсь к Gres
Ну и сами подумайте, многое там отличалось в этих блоках?)

Народ вы не уловили всю соль моего послания.
можно и нужно использовать паттерны проектирования - это конечно полезно и делает код красиво.
Но используйте его тогда в своем проекте в сферическом вакууме.
Вынос паттернов проектирования на уровень продукта с которым работают несколько программистов и есть текучка кадров - это большая ответственность:
- уделите тогда время выработке нормальной документации,
- выделите время на обучение новых сотрудников вашим стандартам и проведение периодического обучения старых.
- найдите человека(ов), который будет следить за соблюдением стандартов.
Ваши заказчики готовы платить за это деньги? тогда да, почему бы и нет.
Возьмем к примеру наш любимый Salesforce:
если фирма берет на работу Salesforce разработчика, то фирма будет уверена, что он знает Salesforce - есть догма - документация, которой ты просто обязан следовать если ты salesforce разработчик.
Salesforce разработчик не обязан знать паттерны проектирования - этого нет в документации Salesforce. А если должен, то что должен знать? Я так понимаю вот это догма?

Gres
Люди читайте ГОФа и Фаулера! :)

Тогда, пусть фирма будет брать на работу salesforce разработчика нужно писать - должен знать "ГОФа и Фаулера".
Нет у паттернов проектирования стандартов, а поэтому каждый будет прав и каждый будет иметь право на свою реализацию только потому что она красиво называется.
Нафига все это? Не усложняйте другим жизнь есть доки по Salesforce - следуйте этим докам и пишите код проще.

Народ вы не уловили всю соль моего послания.
можно и нужно использовать паттерны проектирования - это конечно полезно и делает код красиво.
Но используйте его тогда в своем проекте в сферическом вакууме.
Вынос паттернов проектирования на уровень продукта с которым работают несколько программистов и есть текучка кадров - это большая ответственность:
- уделите тогда время выработке нормальной документации, 
- выделите время на обучение новых сотрудников вашим стандартам и проведение периодического обучения старых.
- найдите человека(ов), который будет следить за соблюдением стандартов.
Ваши заказчики готовы платить за это деньги? тогда да, почему бы и нет.
Возьмем к примеру наш любимый Salesforce:
если фирма берет на работу Salesforce разработчика, то фирма будет уверена, что он знает Salesforce - есть догма - документация, которой ты просто обязан следовать если ты salesforce разработчик.
Salesforce разработчик не обязан знать паттерны проектирования - этого нет в документации Salesforce. А если должен, то что должен знать? Я так понимаю вот это догма?
[quote="Gres"]Люди читайте ГОФа и Фаулера! :)[/quote]
Тогда, пусть фирма будет брать на работу salesforce разработчика нужно писать - должен знать "ГОФа и Фаулера".
[b]Нет у паттернов проектирования стандартов[/b], а поэтому каждый будет прав и каждый будет иметь право на свою реализацию только потому что она красиво называется.
Нафига все это? Не усложняйте другим жизнь :D есть доки по Salesforce - следуйте этим докам и пишите код проще.
 

Типичный пример из жизни
Кто за селекторы взамен чистых SOQL в Salesforce?
Есть селектор, который конструирует запрос и выбирает нужные данные из базы.
Супер! Все используют.
Беру и я использовать - мне не подходит дефолтная сортировка. Что я делаю? лезу в этот селектов и добавляю метод, которые мне возвращает то что мне нужно. И так делает каждый. Что в итоге получаем? Селектор с 100 методами. Причем что делает новый программист? Он не будет разбираться со всех этих 100 методах и набором необходимых параметров и искать то что ему подходит - он обязательно добавит свой (или сломает чужой если мозгов хватит). Что надо делать чтобы такого не произошло? Тратить КУЧУ времени на обучение, проверку кода и длинную железную линейку для пальцев.
И это всего лишь малый пример.

Типичный пример из жизни
Кто за селекторы взамен чистых SOQL в Salesforce?
Есть селектор, который конструирует запрос и выбирает нужные данные из базы.
Супер! Все используют.
Беру и я использовать - мне не подходит дефолтная сортировка. Что я делаю? лезу в этот селектов и добавляю метод, которые мне возвращает то что мне нужно. И так делает каждый. Что в итоге получаем? Селектор с 100 методами. Причем что делает новый программист? Он не будет разбираться со всех этих 100 методах и набором необходимых параметров и искать то что ему подходит - он обязательно добавит свой (или сломает чужой если мозгов хватит). Что надо делать чтобы такого не произошло? Тратить КУЧУ времени на обучение, проверку кода и длинную железную линейку для пальцев.
И это всего лишь малый пример.

Поэтому все начинается красиво, а заканчивается плохо!!!!!!!!!!!!!!!

[color=red][b]Поэтому все начинается красиво, а заканчивается плохо!!!!!!!!!!!!!!![/b][/color]

Тоже пример из жизни.
На проекте есть куча красивых абстракций, красивые DTO все разрабатывалось в рамках одной страницы, выносилось, раскладывалось по слоям. Я пишу уже логику на remoteAction и должен воссоздать тоже самое используя существующую мега оптимизированную логику в бэкенде. Что получается в итоге? Вся логика заточена под VF страницы и не работает под JSON сериализацию. Кастыли? Они родные, куда без них в ООП, ведь уже не DRY.

Тоже пример из жизни.
На проекте есть куча красивых абстракций, красивые DTO все разрабатывалось в рамках одной страницы, выносилось, раскладывалось по слоям. Я пишу уже логику на remoteAction и должен воссоздать тоже самое используя существующую мега оптимизированную логику в бэкенде. Что получается в итоге? Вся логика заточена под VF страницы и не работает под JSON сериализацию. Кастыли? Они родные, куда без них в ООП, ведь уже не DRY.

И что не говорите, на чистый apex (нормально оптимизированный) никто так не жаловался как на результаты внедрения принципов ООП.

И что не говорите, на чистый apex (нормально оптимизированный) никто так не жаловался как на результаты внедрения принципов ООП.

Salesforce разработчик не обязан знать паттерны проектирования - этого нет в документации Salesforce.

Это ведь шутка?
Дмитрий, скажи, что ты это не серьезно.

[quote]Salesforce разработчик не обязан знать паттерны проектирования - этого нет в документации Salesforce. [/quote]
Это ведь шутка? 
Дмитрий, скажи, что ты это не серьезно.


RasMisha
Это ведь шутка?
Дмитрий, скажи, что ты это не серьезно.

RasMisha, после твоего сообщения стал сомневаться.
Слушай, если покажешь где это я, вполне возможно, поменяю свою точку зрения

[quote="RasMisha"]Это ведь шутка? 
Дмитрий, скажи, что ты это не серьезно.[/quote]
RasMisha, после твоего сообщения стал сомневаться.
Слушай, если покажешь где это я, вполне возможно, поменяю свою точку зрения :D 

Ты не про это случаем?
https://developer.salesforce.com/page/Apex_Design_Patterns

Ты не про это случаем?
https://developer.salesforce.com/page/Apex_Design_Patterns

Saleforce-разработчик это прежде всего разработчик, а уже потом "salesforce-".
Я сам раньше не понимал плюсы паттернов (Gres подтвердит), но после 2х более-менее крупных проектов с такой лапшой я просто в отчаяние впадаю, когда вижу код, который вы описываете.
Часто замечаю, что такой код пишут люди "не в команде".

Saleforce-разработчик это прежде всего разработчик, а уже потом "salesforce-".
Я сам раньше не понимал плюсы паттернов (Gres подтвердит), но после 2х более-менее крупных проектов с такой лапшой я просто в отчаяние впадаю, когда вижу код, который вы описываете.
Часто замечаю, что такой код пишут люди "не в команде".

Dmitry Shnyrev
Народ вы не уловили всю соль моего послания.
можно и нужно использовать паттерны проектирования - это конечно полезно и делает код красиво.
Но используйте его тогда в своем проекте в сферическом вакууме.
Вынос паттернов проектирования на уровень продукта с которым работают несколько программистов и есть текучка кадров - это большая ответственность:
- уделите тогда время выработке нормальной документации,
- выделите время на обучение новых сотрудников вашим стандартам и проведение периодического обучения старых.
- найдите человека(ов), который будет следить за соблюдением стандартов.
Ваши заказчики готовы платить за это деньги? тогда да, почему бы и нет.
Возьмем к примеру наш любимый Salesforce:
если фирма берет на работу Salesforce разработчика, то фирма будет уверена, что он знает Salesforce - есть догма - документация, которой ты просто обязан следовать если ты salesforce разработчик.
Salesforce разработчик не обязан знать паттерны проектирования - этого нет в документации Salesforce. А если должен, то что должен знать? Я так понимаю вот это догма?

Мне, конечно, очень жаль тех разработчиков, у которых нет нормальной организации процесса разработки!
Таким образом, можно перейти к понятию разработчик, если человек написал 2 строчки кода - он разработчик?

[quote="Dmitry Shnyrev"]Народ вы не уловили всю соль моего послания.
можно и нужно использовать паттерны проектирования - это конечно полезно и делает код красиво.
Но используйте его тогда в своем проекте в сферическом вакууме.
Вынос паттернов проектирования на уровень продукта с которым работают несколько программистов и есть текучка кадров - это большая ответственность:
- уделите тогда время выработке нормальной документации,
- выделите время на обучение новых сотрудников вашим стандартам и проведение периодического обучения старых.
- найдите человека(ов), который будет следить за соблюдением стандартов.
Ваши заказчики готовы платить за это деньги? тогда да, почему бы и нет.
Возьмем к примеру наш любимый Salesforce:
если фирма берет на работу Salesforce разработчика, то фирма будет уверена, что он знает Salesforce - есть догма - документация, которой ты просто обязан следовать если ты salesforce разработчик.
Salesforce разработчик не обязан знать паттерны проектирования - этого нет в документации Salesforce. А если должен, то что должен знать? Я так понимаю вот это догма? [/quote]
Мне, конечно, очень жаль тех разработчиков, у которых нет нормальной организации процесса разработки!
Таким образом, можно перейти к понятию разработчик, если человек написал 2 строчки кода - он разработчик?

Dmitry Shnyrev
Нафига все это? Не усложняйте другим жизнь

Почему-то я не увидел ни одного аргументированного ответа, в пользу того, что это сложно!

[quote="Dmitry Shnyrev"]Нафига все это? Не усложняйте другим жизнь[/quote]
Почему-то я не увидел ни одного аргументированного ответа, в пользу того, что это сложно!

Dmitry Shnyrev
Поэтому все начинается красиво, а заканчивается плохо!!!!!!!!!!!!!!!

Ну или начинается просто, а заканчивается еще хуже!

[quote="Dmitry Shnyrev"]Поэтому все начинается красиво, а заканчивается плохо!!!!!!!!!!!!!!![/quote]
Ну или начинается просто, а заканчивается еще хуже!

Dmitry Shnyrev
И что не говорите, на чистый apex (нормально оптимизированный) никто так не жаловался как на результаты внедрения принципов ООП.

Что ты понимаешь под чистым Apex?
Кст, ты не думая об этом, все равно импользуешь кучу паттернов, например, тот же MVC.

[quote="Dmitry Shnyrev"]И что не говорите, на чистый apex (нормально оптимизированный) никто так не жаловался как на результаты внедрения принципов ООП.[/quote]
Что ты понимаешь под чистым Apex?
Кст, ты не думая об этом, все равно импользуешь кучу паттернов, например, тот же MVC.

Знаешь, проблема правильного кода, как ты верно подметил, не в кода а в командах.
Знаешь, я сейчас попал в команду, проект, в котором все мега круто и очень по ООП, но мы тратим 30% времени только на то чтобы поддерживать это все в рабочем состоянии и не сломать. Это круто. Есть чему поучиться.
Но я хочу заметить из минусов:
- скорость разработки катастрофически низкая. Необходимо следить за тем что делает КАЖДЫЙ разработчик, чтобы быть в курсе последних изменений и знать как их использовать. Приходится ждать пока один выкатит кусок кода чтобы все потом начали его использовать и это тоже не 5-10 минут.
- все равно костыли про которые я упоминал выше, каждому надо своя вариация общего функционала.
- кода реально ДОХРЕНА. На простейший проект уже потрачено половина лимита в 3 000 000 символов.
Тут только команда в максимум 5-7 человек сможет нормально работать. Что собственно и происходит.
Я работал на других проектах, где людей есть или побывала куча и нет четкого центра, контроля. Это реально жесть. Если еще страницу + контроллер ( + возможно отдельно логика ) еще можно как-то разобрать и починить, допилить, то уже с пародиями на ООП просто ничего не реально сделать - проще заново написать.

Прелесть ООП в одном - можно посадить заказчика на "иглу" и разводить его на деньги.

В идеальном мире может все это ООП и работает, но в реально увы

Знаешь, проблема правильного кода, как ты верно подметил, не в кода а в командах.
Знаешь, я сейчас попал в команду, проект, в котором все мега круто и очень по ООП, но мы тратим 30% времени только на то чтобы поддерживать это все в рабочем состоянии и не сломать. Это круто. Есть чему поучиться.
Но я хочу заметить из минусов:
- скорость разработки катастрофически низкая. Необходимо следить за тем что делает КАЖДЫЙ разработчик, чтобы быть в курсе последних изменений и знать как их использовать. Приходится ждать пока один выкатит кусок кода чтобы все потом начали его использовать и это тоже не 5-10 минут. 
- все равно костыли про которые я упоминал выше, каждому надо своя вариация общего функционала.
- кода реально ДОХРЕНА. На простейший проект уже потрачено половина лимита в 3 000 000 символов.
Тут только команда в максимум 5-7 человек сможет нормально работать. Что собственно и происходит.
Я работал на других проектах, где людей есть или побывала куча и нет четкого центра, контроля. Это реально жесть. Если еще страницу + контроллер ( + возможно отдельно логика ) еще можно как-то разобрать и починить, допилить, то уже с пародиями на ООП просто ничего не реально сделать - проще заново написать.

Прелесть ООП в одном - можно посадить заказчика на "иглу" и разводить его на деньги.

В идеальном мире может все это ООП и работает, но в реально увы :( 


Gres
Что ты понимаешь под чистым Apex?

пришел запрос - его обработали максимум в одно проваливание (один метод с бизнес логикой), без всяких оберток над DML, SOQL, DTO.

Gres
Кст, ты не думая об этом, все равно импользуешь кучу паттернов, например, тот же MVC.

Gres, а ты очень даже прав Просто я за простоту. Я за максимальное использование стандартных возможностей Apex.
Есть же SOQL и DML нафига их оборачивать? Нафига делать кучу включенных друг в друга страниц? Компоненты это вообще зло! Нафига делать универсальные DTO для передачи результатов между методами, когда в этом DTO для каждого метода свой набор атрибутов.

[quote="Gres"]Что ты понимаешь под чистым Apex? [/quote]
пришел запрос - его обработали максимум в одно проваливание (один метод с бизнес логикой), без всяких оберток над DML, SOQL, DTO.

[quote="Gres"]Кст, ты не думая об этом, все равно импользуешь кучу паттернов, например, тот же MVC.[/quote]
Gres, а ты очень даже прав ;) Просто я за простоту. Я за максимальное использование стандартных возможностей Apex.
Есть же SOQL и DML нафига их оборачивать? Нафига делать кучу включенных друг в друга страниц? Компоненты это вообще зло! Нафига делать универсальные DTO для передачи результатов между методами, когда в этом DTO для каждого метода свой набор атрибутов.

Gres
тот же MVC

Это стандарт которые диктует SF
M - object
V - visualforce
C - apex class(es)
Конечно использую

[quote="Gres"]тот же MVC[/quote]
Это стандарт которые диктует SF
M - object
V - visualforce
C - apex class(es)
Конечно использую :D 

Ладно народ!!!! Неплохо пообщались!!! Каждый высказал свою точку зрения исходя из опыта.
Понятное дело что я тоже использую паттерны проектирования (просто может не всегда об этом догадываюсь )

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

Ладно народ!!!! Неплохо пообщались!!! Каждый высказал свою точку зрения исходя из опыта.
Понятное дело что я тоже использую паттерны проектирования (просто может не всегда об этом догадываюсь :) )

Наверное выскажу общее мнение всех здесь отписавшихся:
[b]писать код надо проще, и с паттернами или без паттернов это не имеет значение.[/b]

Кстати, на счет https://developer.salesforce.com/page/Apex_Design_Patterns#Facade - мой случай про класс на 2к строчек, над которым я сейчас работаю.

А вот https://developer.salesforce.com/page/Apex_Design_Patterns#Strategy - это ужас, если использовать его в Eclipse. Я столько намучался птм с моим кодом, который был сделан по канонам этого паттерна. Вот разберусь с MavensMate, тогда попробую еще раз.

Максимум, что я из ООП сейчас использую, это наследование :-) Делаю базовый DTO с минимальным набором полей и полный - с полным набором полей. Сервис возвращает базовый когда в запросе приходит определенный флаг, и полный, когда его нет.

Кстати, на счет https://developer.salesforce.com/page/Apex_Design_Patterns#Facade - мой случай про класс на 2к строчек, над которым я сейчас работаю.

А вот https://developer.salesforce.com/page/Apex_Design_Patterns#Strategy - это ужас, если использовать его в Eclipse. Я столько намучался птм с моим кодом, который был сделан по канонам этого паттерна. Вот разберусь с MavensMate, тогда попробую еще раз.

Максимум, что я из ООП сейчас использую, это наследование :-) Делаю базовый DTO с минимальным набором полей и полный - с полным набором полей. Сервис возвращает базовый когда в запросе приходит определенный флаг, и полный, когда его нет.

Dmitry Shnyrev
Знаешь, проблема правильного кода, как ты верно подметил, не в кода а в командах.
Знаешь, я сейчас попал в команду, проект, в котором все мега круто и очень по ООП, но мы тратим 30% времени только на то чтобы поддерживать это все в рабочем состоянии и не сломать. Это круто. Есть чему поучиться.
Но я хочу заметить из минусов:
- скорость разработки катастрофически низкая. Необходимо следить за тем что делает КАЖДЫЙ разработчик, чтобы быть в курсе последних изменений и знать как их использовать. Приходится ждать пока один выкатит кусок кода чтобы все потом начали его использовать и это тоже не 5-10 минут.
- все равно костыли про которые я упоминал выше, каждому надо своя вариация общего функционала.
- кода реально ДОХРЕНА. На простейший проект уже потрачено половина лимита в 3 000 000 символов.
Тут только команда в максимум 5-7 человек сможет нормально работать. Что собственно и происходит.
Я работал на других проектах, где людей есть или побывала куча и нет четкого центра, контроля. Это реально жесть. Если еще страницу + контроллер ( + возможно отдельно логика ) еще можно как-то разобрать и починить, допилить, то уже с пародиями на ООП просто ничего не реально сделать - проще заново написать.

Прелесть ООП в одном - можно посадить заказчика на "иглу" и разводить его на деньги.

В идеальном мире может все это ООП и работает, но в реально увы :(


Был совершенно противоположный опыт: огромный классы, методы, только глобальные переменные. Тратилось больше 50% времени только чтобы разобраться, что происходит, и найти проблему, причем время не уменьшалось по мере работы с проектом, т.е. скорость разработки очень низкая, куча одинакогого кода, и в кажом месте ты правишь ошибки. Работать даже минимум 2 просто нереально, постоянно пересекаешься с товарищами и перезатираешь их код. Заказчик был "на игле" постоянно что-то ломалось.
Итог - проведен рефакторинг, кода стало в 2 раза меньше, приложение работает быстрее, баги фиксятся за пару минут. И мир совершенно реален. =)
Всем удачи с вашими проектами.

[quote="Dmitry Shnyrev"]Знаешь, проблема правильного кода, как ты верно подметил, не в кода а в командах.
Знаешь, я сейчас попал в команду, проект, в котором все мега круто и очень по ООП, но мы тратим 30% времени только на то чтобы поддерживать это все в рабочем состоянии и не сломать. Это круто. Есть чему поучиться.
Но я хочу заметить из минусов:
- скорость разработки катастрофически низкая. Необходимо следить за тем что делает КАЖДЫЙ разработчик, чтобы быть в курсе последних изменений и знать как их использовать. Приходится ждать пока один выкатит кусок кода чтобы все потом начали его использовать и это тоже не 5-10 минут. 
- все равно костыли про которые я упоминал выше, каждому надо своя вариация общего функционала.
- кода реально ДОХРЕНА. На простейший проект уже потрачено половина лимита в 3 000 000 символов.
Тут только команда в максимум 5-7 человек сможет нормально работать. Что собственно и происходит.
Я работал на других проектах, где людей есть или побывала куча и нет четкого центра, контроля. Это реально жесть. Если еще страницу + контроллер ( + возможно отдельно логика ) еще можно как-то разобрать и починить, допилить, то уже с пародиями на ООП просто ничего не реально сделать - проще заново написать.

Прелесть ООП в одном - можно посадить заказчика на "иглу" и разводить его на деньги.

В идеальном мире может все это ООП и работает, но в реально увы :([/quote]
Был совершенно противоположный опыт: огромный классы, методы, только глобальные переменные. Тратилось больше 50% времени только чтобы разобраться, что происходит, и найти проблему, причем время не уменьшалось по мере работы с проектом, т.е. скорость разработки очень низкая, куча одинакогого кода, и в кажом месте ты правишь ошибки. Работать даже минимум 2 просто нереально, постоянно пересекаешься с товарищами и перезатираешь их код. Заказчик был "на игле" постоянно что-то ломалось.
Итог - проведен рефакторинг, кода стало в 2 раза меньше, приложение работает быстрее, баги фиксятся за пару минут. И мир совершенно реален. =)
Всем удачи с вашими проектами.

Dmitry Shnyrev
И что не говорите, на чистый apex (нормально оптимизированный) никто так не жаловался как на результаты внедрения принципов ООП.

Просто Дима у нас стороник функционального подхода.
Вот сегодняшний тоp человек знал как работают шаблоны но не знал salesforce,думаю можно догодаться какая здесь ошибка произошла.

for(PricingRequest__c pricingRequest : pricingRequests) {
for (PricingEquipmentModel model : Pricing.getEquipment(pricingRequest))
{
prvoList.add(Pricing.createPricingRequestOption(pricingRequest,model));
}
}

[quote="Dmitry Shnyrev"]И что не говорите, на чистый apex (нормально оптимизированный) никто так не жаловался как на результаты внедрения принципов ООП.[/quote]
Просто Дима у нас стороник функционального подхода.
Вот сегодняшний тоp человек знал как работают шаблоны но не знал salesforce,думаю можно догодаться какая здесь ошибка произошла. 

for(PricingRequest__c pricingRequest : pricingRequests) {
  for (PricingEquipmentModel model : Pricing.getEquipment(pricingRequest))
  {
    prvoList.add(Pricing.createPricingRequestOption(pricingRequest,model));
  }
}

Ой какая жесть! Java попахивает.

Ой какая жесть! Java попахивает.

Это Apex ошибку догодался какую получил?

Это Apex ошибку догодался какую получил? 

Sergey Prichepo
Это Apex ошибку догодался какую получил?

ну наверное у тебя где-то внутри SOQL или DML и влетел в лимиты

[quote="Sergey Prichepo"]Это Apex ошибку догодался какую получил?[/quote]
ну наверное у тебя где-то внутри SOQL или DML и влетел в лимиты

Точно SOQL ! Я к тому это говорю что не правильное использование шаблонов хуже чем просто класс с набором методов.Кто это переписывать будет я не знаю там кода под 4K

Точно SOQL ! Я к тому это говорю что не правильное использование шаблонов хуже чем просто класс с набором методов.Кто это переписывать будет я не знаю там кода под 4K

Так может паттерны не ради паттернов делаются?
А ради удобства поддержки, расширяемости + если останется кому-то легаси
То что в примере просто криворукость какая-то, которая не учитывает особенности SF.

:D Так может паттерны не ради паттернов делаются?
А ради удобства поддержки, расширяемости + если останется кому-то легаси
То что в примере просто криворукость какая-то, которая не учитывает особенности SF.

RasMisha
:D Так может паттерны не ради паттернов делаются?
А ради удобства поддержки, расширяемости + если останется кому-то легаси
То что в примере просто криворукость какая-то, которая не учитывает особенности SF.

Полностью согласен с этим. Вот простой пример я для своего проекта написал триггер паттерн клас в котором 3 иннер класса для сбора статистики и обработки исключений. На работе мой начальник разбил этот класс аж на 4 класса. И что вы думаете это улучшило хоть что-то ?

[quote="RasMisha"]:D Так может паттерны не ради паттернов делаются?
А ради удобства поддержки, расширяемости + если останется кому-то легаси
То что в примере просто криворукость какая-то, которая не учитывает особенности SF.[/quote]

Полностью согласен с этим. Вот простой пример я для своего проекта написал триггер паттерн клас в котором 3 иннер класса для сбора статистики и обработки исключений. На работе мой начальник разбил этот класс аж на 4 класса. И что вы думаете это улучшило хоть что-то ?