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

ООП паттерны. Много теории и так мало практики.

Как известно, програмист, он никакой не програмист пока не освоил ООП.

И как известно, ООП никак не освоенно програмистом, пока он слету не перечислил все ООП паттерны с примерами из жизни... так как именно эти потерны и раскрывают потенциал ООП.

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

так вот, предлагаю в этой теме немного вспомнить об ООП паттернах. Где-то на форуме уже приводилась ссылка на статью об ООП паттернах в СФ.

пока такие вопросы:
изучаю Factory Pattern вот здесь:

http://www.oodesign.com/factory-pattern.html

так вот там пример фабрики у которой НЕТ захардкоденных селекторов того какой продукт изготовить,
а все варианты продуктов с АйДи прописываются в HashMap и оттуда берутся.
так вот меня удивило то, что класс там упоминается просто как класс, то есть вроде MyClass.class и потом из такого упоминанию создается экземпляр (!):

class ProductFactory
{
private HashMap m_RegisteredProducts = new HashMap();

public void registerProduct (String productID, Class productClass)
{
m_RegisteredProducts.put(productID, productClass);
}

public Product createProduct(String productID)
{
Class productClass = (Class)m_RegisteredProducts.get(productID);
Constructor productConstructor = cClass.getDeclaredConstructor(new Class[] { String.class });
return (Product)productConstructor.newInstance(new Object[] { });
}
}

такое возможно в Апекс?

плюс как предлагается зарегить новый продукт в фабрике:

class OneProduct extends Product
{
static {
Factory.instance().registerProduct("ID1",OneProduct.class);
}
...
}

что это такое там static {...}?
(ну то что сама фабрика здесь выполнена по синглтон патерну эту другой разговор).

Как известно, програмист, он никакой не програмист пока не освоил ООП.

И как известно, ООП никак не освоенно програмистом, пока он слету не перечислил все ООП паттерны с примерами из жизни... так как именно эти потерны и раскрывают потенциал ООП.

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

так вот, предлагаю в этой теме немного вспомнить об ООП паттернах. Где-то на форуме уже приводилась ссылка на статью об ООП паттернах в СФ.

пока такие вопросы:
изучаю Factory Pattern вот здесь:

http://www.oodesign.com/factory-pattern.html

так вот там пример фабрики у которой НЕТ захардкоденных селекторов того какой продукт изготовить,
а все варианты продуктов с АйДи прописываются в HashMap и оттуда берутся.
так вот меня удивило то, что  класс там упоминается просто как класс, то есть вроде MyClass.class и потом из такого упоминанию создается экземпляр (!):

[code]class ProductFactory
{
	private HashMap m_RegisteredProducts = new HashMap();

	public void registerProduct (String productID, [b]Class productClass[/b])
	{
		m_RegisteredProducts.put(productID, productClass);
	}

	public Product createProduct(String productID)
	{
		[b]Class productClass = (Class)m_RegisteredProducts.get(productID);[/b]
		Constructor productConstructor = cClass.getDeclaredConstructor(new Class[] { String.class });
		return (Product)productConstructor.newInstance(new Object[] { });
	}
}[/code]

такое возможно в Апекс?

плюс как предлагается зарегить новый продукт в  фабрике:

[code]class OneProduct extends Product
{
	static {
		Factory.instance().registerProduct("ID1",OneProduct.class);
	}
	...
}[/code]

что это такое там [b]static {...}[/b]?
(ну то что сама фабрика здесь выполнена по синглтон патерну эту другой разговор).

Den Brown
такое возможно в Апекс?

Возможно
https://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_type.htm
Я использую данный класс для реализации антипаттерна Service Locator, так как в СФ нормальной инъекции зависимостей сделать нельзя.
Den Brown
что это такое там static {...}?

Инициализатор, выполняется когда слздается экземпляр класса
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.7
Я, например, использую такой синтаксис для инициализации предопределенных мап.

[quote="Den Brown"]такое возможно в Апекс?[/quote]
Возможно
https://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_type.htm
Я использую данный класс для реализации антипаттерна Service Locator, так как в СФ нормальной инъекции зависимостей сделать нельзя.
[quote="Den Brown"]что это такое там static {...}? [/quote]
Инициализатор, выполняется когда слздается экземпляр класса
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.7
Я, например, использую такой синтаксис для инициализации предопределенных мап.

Den Brown
Как известно, програмист, он никакой не програмист пока не освоил ООП.

Советую прочитать ГОФа - http://www.ozon.ru/context/detail/id/2457392/ и Фаулера - http://www.ozon.ru/context/detail/id/4884925/

Den Brown
Но в Апекс у нас обычно нет такой глубины задач, чтобы внедрять паттерны, да и об ООП в целом не каждый день вспоминаешь.

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

[quote="Den Brown"]Как известно, програмист, он никакой не програмист пока не освоил ООП.[/quote]
Советую прочитать ГОФа - http://www.ozon.ru/context/detail/id/2457392/ и Фаулера - http://www.ozon.ru/context/detail/id/4884925/

[quote="Den Brown"]Но в Апекс у нас обычно нет такой глубины задач, чтобы внедрять паттерны, да и об ООП в целом не каждый день вспоминаешь.[/quote]
Для ООП не нужна глубина задач. Просто большиство людей, пишущих код, очень ленивые и совершенно не думают о гибкости кода, расширяемости и дельнейшей поддержке.

Den Brown
так вот, предлагаю в этой теме немного вспомнить об ООП паттернах. Где-то на форуме уже приводилась ссылка на статью об ООП паттернах в СФ.

На самом деле паттерны никак не привязанны к платформе, там просто приводится реализации наиболее используемых шаблонов из того же ГОФа скорее всего.

[quote="Den Brown"]так вот, предлагаю в этой теме немного вспомнить об ООП паттернах. Где-то на форуме уже приводилась ссылка на статью об ООП паттернах в СФ.[/quote]
На самом деле паттерны никак не привязанны к платформе, там просто приводится реализации наиболее используемых шаблонов из того же ГОФа скорее всего.

Могу посоветовать Блог Александра Бындю, мне нравится как он пишет о гибких архитектурах и подходах к программированию.

Могу посоветовать [url=http://blog.byndyu.ru/]Блог Александра Бындю[/url], мне нравится как он пишет о гибких архитектурах и подходах к программированию.

кажется, я нашел родственную душу

кажется, я нашел родственную душу

Den Brown
кажется, я нашел родственную душу

Спрашивай.
О паттернах, принципах S.O.L.I.D. DI, CI могу много чего рассказать и показать.

[quote="Den Brown"]кажется, я нашел родственную душу[/quote]
Спрашивай.
О паттернах, принципах S.O.L.I.D. DI, CI могу много чего рассказать и показать.

Gres
Den Brown
кажется, я нашел родственную душу

Спрашивай.
О паттернах, принципах S.O.L.I.D. DI, CI могу много чего рассказать и показать.

Давай, начинай. А мы подзватим :)

[quote="Gres"][quote="Den Brown"]кажется, я нашел родственную душу[/quote]
Спрашивай.
О паттернах, принципах S.O.L.I.D. DI, CI могу много чего рассказать и показать.[/quote]

Давай, начинай. А мы подзватим :)

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

и так вопрос по поводу классической Фабрики (не фабричного метода и не абстрактной - до них еще не дошел):
http://www.oodesign.com/factory-pattern.html

в чем экзистенциальный смысл такого класса-фабрики?

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

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

и так вопрос по поводу классической Фабрики (не фабричного метода и не абстрактной - до них еще не дошел):
http://www.oodesign.com/factory-pattern.html

в чем экзистенциальный смысл такого класса-фабрики?

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

Den Brown
в чем экзистенциальный смысл такого класса-фабрики?

Создание нужного тебе объекта.
Den Brown
смысл Фабрики именно в сокращении строк кода, я так понял

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

[quote="Den Brown"]в чем экзистенциальный смысл такого класса-фабрики?[/quote]
Создание нужного тебе объекта.
[quote="Den Brown"]смысл Фабрики именно в сокращении строк кода, я так понял[/quote]
Ну вообще смысл большинства шаблонов - уменьшение дублированного кода.
Например, тебе нужно создать сложный объект и недостаточно просто вызвать конструктор и ты пишешь класс-фабрику для создания этого объекта, а если в будущем логика создания изменится тебе не придется бегать по всем проекту и исправлять код, ты все сможешь сделать в одном месте. Также фабрика применима для создания потомков одного базового типа.

Рекомедую к прочитению вот это https://www.packtpub.com/application-development/forcecom-enterprise-architecture (там пара глав посвящена шаблонам проектирования), автор CTO Financing Force и Force.com MVP, поэтому он в "теме" и пишет по делу.

Рекомедую к прочитению вот это https://www.packtpub.com/application-development/forcecom-enterprise-architecture (там пара глав посвящена шаблонам проектирования), автор CTO Financing Force и Force.com MVP, поэтому он в "теме" и пишет по делу.

Mike V
Рекомедую к прочитению вот это https://www.packtpub.com/application-development/forcecom-enterprise-architecture

спасибо, а что в книге: общее архитектурное и БА обсуждение построения приложений или примеры кода, паттернов, DB схем? потому что есть книги Jonathan Sapir - там общая часть, а есть книга Dan Appleman "Advanced APEX" - там конкреные ситуации с кодом. И нет ничего между этими двумя вариантами.

[quote="Mike V"]Рекомедую к прочитению вот это https://www.packtpub.com/application-development/forcecom-enterprise-architecture[/quote]
спасибо, а что в книге: общее архитектурное и БА обсуждение построения приложений или примеры кода, паттернов, DB схем? потому что есть книги Jonathan Sapir - там общая часть, а есть книга Dan Appleman "Advanced APEX" - там конкреные ситуации с кодом. И нет ничего между этими двумя вариантами.

Den Brown
Mike V
Рекомедую к прочитению вот это https://www.packtpub.com/application-development/forcecom-enterprise-architecture

спасибо, а что в книге: общее архитектурное и БА обсуждение построения приложений или примеры кода, паттернов, DB схем? потому что есть книги Jonathan Sapir - там общая часть, а есть книга Dan Appleman "Advanced APEX" - там конкреные ситуации с кодом. И нет ничего между этими двумя вариантами.

Ну вот это вполне между ними: и обсуждение шаблонов проектирования (применительно к Force.com) и код, собственно вся книга - это проетирование/разработка примера-приложения на Force.com c учетом шаблонов.

[quote="Den Brown"][quote="Mike V"]Рекомедую к прочитению вот это https://www.packtpub.com/application-development/forcecom-enterprise-architecture[/quote]
спасибо, а что в книге: общее архитектурное и БА обсуждение построения приложений или примеры кода, паттернов, DB схем? потому что есть книги Jonathan Sapir - там общая часть, а есть книга Dan Appleman "Advanced APEX" - там конкреные ситуации с кодом. И нет ничего между этими двумя вариантами.[/quote]

Ну вот это вполне между ними: и обсуждение шаблонов проектирования (применительно к Force.com) и код, собственно вся книга - это проетирование/разработка примера-приложения на Force.com c учетом шаблонов.

надо брать

надо брать

http://www.ozon.ru/context/detail/id/31079082/ - изи левел, для начинающих изучать паттерны. Примеры кода на java. (можно найти в pdf)

Блог А. Бындю, как заметил Gres - отличный материал.

Если нужна просто шпаргалка - http://andrey.moveax.ru/design-patterns/oop/

http://www.ozon.ru/context/detail/id/31079082/ - изи левел, для начинающих изучать паттерны. Примеры кода на java. (можно найти в pdf)

Блог А. Бындю, как заметил Gres - отличный материал.

Если нужна просто шпаргалка - http://andrey.moveax.ru/design-patterns/oop/

Дима Лисовский
Если нужна просто шпаргалка - http://andrey.moveax.ru/design-patterns/oop/

читаю, и думаю, что так легко читается, но слова какие-то странные. потом - понял: читаю на русском...
спасибо

[quote="Дима Лисовский"]Если нужна просто шпаргалка - http://andrey.moveax.ru/design-patterns/oop/[/quote]

читаю, и думаю, что так легко читается, но слова какие-то странные. потом - понял: читаю на русском...
спасибо

Дима Лисовский
Если нужна просто шпаргалка - http://andrey.moveax.ru/design-patterns/oop/

Тоже известный мне человек)

[quote="Дима Лисовский"]Если нужна просто шпаргалка - http://andrey.moveax.ru/design-patterns/oop/[/quote]
Тоже известный мне человек)

Если честно, я юзаю только свои разработанные паттерны для SF. Все таки SF это не Java. Главное читабельность, удобство, быстродействие.

Если честно, я юзаю только свои разработанные паттерны для SF. Все таки SF это не Java. Главное читабельность, удобство, быстродействие.

Виктор Сенько
Если честно, я юзаю только свои разработанные паттерны для SF.

Все уже придумано до нас)

[quote="Виктор Сенько"]Если честно, я юзаю только свои разработанные паттерны для SF.[/quote]
Все уже придумано до нас)

Виктор Сенько
Все таки SF это не Java

При чем тут это?
Или только в Java нужны шаблоны?

[quote="Виктор Сенько"] Все таки SF это не Java[/quote]
При чем тут это?
Или только в Java нужны шаблоны?

Я образно сказал)

Я образно сказал) 
[url=http://th3silverlining.com/2014/06/06/a-beginners-guide-to-object-oriented-programming-with-apex/]A Beginner’s Guide to Object-Oriented Programming with Apex: 0. An Introduction[/url]

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

Эх, Gres, Gres,
проблема не только в нас, криворуких, дело в том что часто менеджеры

Gres
совершенно не думают о гибкости кода, расширяемости и дальнейшей поддержке

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

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

[quote="Gres"]Просто большиство людей, пишущих код, очень ленивые и совершенно не думают о гибкости кода, расширяемости и дельнейшей поддержке.[/quote]

Эх, Gres, Gres,
проблема не только в нас, криворуких, дело в том что часто менеджеры 
[quote="Gres"]совершенно не думают о гибкости кода, расширяемости и дальнейшей поддержке[/quote]

все что мы слышим: [i]давай, давай как есть двигай в прод, что ты там выдумываешь, кто там разберет твои премудрости после тебя...[/i]

но я на выходных напишу фабрику с именами классов для себя, дайте только идею в каком случае, сценарии ее можно использовать ([b]простейшие[/b] варианты, плиз, но жизненные) 

Den Brown
что ты там выдумываешь, кто там разберет твои премудрости после тебя...

Золотые слова

[quote="Den Brown"]что ты там выдумываешь, кто там разберет твои премудрости после тебя...[/quote]
Золотые слова :D 

Dmitry Shnyrev
Den Brown
что ты там выдумываешь, кто там разберет твои премудрости после тебя...

Золотые слова :D

По опыту знаю здесь проблема не в том что там кто чего то выдумывает, а вообщей подготовке спеца который потом будет разбираться время тратить,пример работал в одно конторе там реально было два умных тeam lead, cчас уже архитекторы,Там шаблоны двигали сверху а не снизу,я сказал что все так пишем значит все пишем,заказчик подождет все решение проблемы.В наших реалях хотя бы ТDD освоили.

[quote="Dmitry Shnyrev"][quote="Den Brown"]что ты там выдумываешь, кто там разберет твои премудрости после тебя...[/quote]
Золотые слова :D[/quote]
По опыту знаю здесь проблема не в том что там кто чего то выдумывает, а вообщей подготовке спеца который потом будет разбираться время тратить,пример работал в одно конторе там реально было два умных тeam lead, cчас уже архитекторы,Там шаблоны двигали сверху а не снизу,я сказал что все так пишем значит все пишем,заказчик подождет все решение проблемы.В наших реалях хотя бы ТDD освоили. 

Согласен, все идет сверху. Абсолютно верно.
Подстроиться под стиль программирования не так сложно. Пару раз железной линейкой по пальцам получить и все будет нормально.

Я помню как-то на собеседовании мне задали очень интересный вопрос:
"Если вы видите что решение вашего лида неверное (плохое), то что вы будете делать?"
Я ответил что "Конечно обсужу, предложу свою точку зрение, но если лид настаивает на своем решении, буду делать как лид сказал". Несостоявшиеся Директор и Лид заулыбались. Не знаю хорошо я ответил или нет Просто у меня за плечами дохрена лет армии и я знаю что такое субординация и что значит обсуждать приказы старших. Кстати как этого не хватает в IT фирмах.

Это я к тому что все зависит от Главного. Хочет Главный чтобы был ООП, будет ООП. Хочет чтобы было по-быстрому, будет по-быстрому Я думаю то что TDD не освоили это не проблема того что "не освоили", а проблема того что "не используют".

Согласен, все идет сверху.  Абсолютно верно.
Подстроиться под стиль программирования не так сложно. Пару раз железной линейкой по пальцам получить и все будет нормально.

Я помню как-то на собеседовании мне задали очень интересный вопрос:
"Если вы видите что решение вашего лида неверное (плохое), то что вы будете делать?"
Я ответил что "Конечно обсужу, предложу свою точку зрение, но если лид настаивает на своем решении, буду делать как лид сказал". Несостоявшиеся Директор и Лид заулыбались. Не знаю хорошо я ответил или нет :) Просто у меня за плечами дохрена лет армии и я знаю что такое субординация и  что значит обсуждать приказы старших. Кстати как этого не хватает в IT фирмах.

Это я к тому что все зависит от Главного. Хочет Главный чтобы был ООП, будет ООП. Хочет чтобы было по-быстрому, будет по-быстрому :D Я думаю то что TDD не освоили это не проблема того что "не освоили", а проблема того что "не используют".


Кстати, осилил приведенную выше книженцию по "Force.com Enterprise Architecture".
На примерах в книге довольно легко понять чего стоят в апексе самые фундаментальные паттерны, но нужно учитывать, что все там строится на использовании опенсоурсного фреймворка Financial Force.

Просмотрев все предлагаемые решения, не могу сказать что готов все это взять себе на вооружение в проект, особенно реализацию отдельной прослойки селекторов (используемые критерии фильтрации достаточно уникальны) и подхода к передаче айдишников вместо конкретных экземпляров sObject (повторные селекты по таблицам с 1кк+ записей для синхронных операций сильно влияют на быстродействие).

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

Кстати, осилил приведенную выше книженцию по "Force.com Enterprise Architecture".
На примерах в книге довольно легко понять чего стоят в апексе самые фундаментальные паттерны, но нужно учитывать, что все там строится на использовании опенсоурсного фреймворка Financial Force. 

Просмотрев все предлагаемые решения, не могу сказать что готов все это взять себе на вооружение в проект, особенно реализацию отдельной прослойки селекторов (используемые критерии фильтрации достаточно уникальны) и подхода к передаче айдишников вместо конкретных экземпляров sObject (повторные селекты по таблицам с 1кк+ записей для синхронных операций сильно влияют на быстродействие).

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

Den Brown
проблема не только в нас, криворуких, дело в том что часто менеджеры

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

[quote="Den Brown"]проблема не только в нас, криворуких, дело в том что часто менеджеры [/quote]
Менеджеры есть у всех, дело в идеологии и привычке.
Ты пишешь код так, как ты привык его писать, и если у тебя нет желания менять стиль/развиваться, то все останется на своих местах.

Sergey Prichepo
В наших реалях хотя бы ТDD освоили.

С отсутствием моков не вижу применения TDD на данной платформе.

[quote="Sergey Prichepo"]В наших реалях хотя бы ТDD освоили.[/quote]
С отсутствием моков не вижу применения TDD на данной платформе.

Dmitry Shnyrev
Den Brown
что ты там выдумываешь, кто там разберет твои премудрости после тебя...

Золотые слова :D

Совесть :)

[quote="Dmitry Shnyrev"][quote="Den Brown"]что ты там выдумываешь, кто там разберет твои премудрости после тебя...[/quote]
Золотые слова :D[/quote]
Совесть :)

cidr8n
Просмотрев все предлагаемые решения, не могу сказать что готов все это взять себе на вооружение в проект, особенно реализацию отдельной прослойки селекторов (используемые критерии фильтрации достаточно уникальны) и подхода к передаче айдишников вместо конкретных экземпляров sObject (повторные селекты по таблицам с 1кк+ записей для синхронных операций сильно влияют на быстродействие).

Ну как бы это же не серебрянная пуля, а просто еще один подход у проектированию. Я бы тоже весь их framework в проект не потащил.

[quote="cidr8n"] 

Просмотрев все предлагаемые решения, не могу сказать что готов все это взять себе на вооружение в проект, особенно реализацию отдельной прослойки селекторов (используемые критерии фильтрации достаточно уникальны) и подхода к передаче айдишников вместо конкретных экземпляров sObject (повторные селекты по таблицам с 1кк+ записей для синхронных операций сильно влияют на быстродействие).

[/quote]

Ну как бы это же не серебрянная пуля, а просто еще один подход у проектированию. Я бы тоже весь их framework в проект не потащил.

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

вот именно такие мои проекты, хорошо описано.

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

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

вот именно такие мои проекты, хорошо описано.

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

Den Brown
но все равно буду шевелится сам и изучать новые вещи, даже если меня и не шевелят.

Я бы лучше направил твою энергию на изучения различных интеграций, чем тратил время на вопросы как усложнить себе жизнь. Займись плотно изучением темы создания на базе Salesforce call center. Полностью, весь процесс с нуля. Развертывание call center (различных типовых решений) интеграция с Salesforce и не просто интеграция на уровне стандартных настроек, а CTI, WebRTC. Знаю, тема сложная, но результат ее освоения будет ОГРОМНЫЙ. Вот это нужно сегодня 99% бизнеса, а не сколько паттернов проектирования ты знаешь.

[quote="Den Brown"]но все равно буду шевелится сам и изучать новые вещи, даже если меня и не шевелят.[/quote]
Я бы лучше направил твою энергию на изучения различных интеграций, чем тратил время на вопросы как усложнить себе жизнь. Займись плотно изучением темы создания на базе Salesforce call center. Полностью, весь процесс с нуля. Развертывание call center (различных типовых решений) интеграция с Salesforce и не просто интеграция на уровне стандартных настроек, а CTI, WebRTC. Знаю, тема сложная, но результат ее освоения будет ОГРОМНЫЙ. Вот это нужно сегодня 99% бизнеса, а не сколько паттернов проектирования ты знаешь. 

Пусть где-то будет говнокод (но Salesforce уже своего рода фреймворк, который диктует правила структурирования кода, так что это уже не говнокод). Зато если твои решения будут заставлять заказчиков писаться от радости, вот это будет настоящее признание твоей работы.

Пусть где-то будет говнокод (но Salesforce уже своего рода фреймворк, который диктует правила структурирования кода, так что это уже не говнокод). Зато если твои решения будут заставлять заказчиков писаться от радости, вот это будет настоящее признание твоей работы.

Gres
Sergey Prichepo
В наших реалях хотя бы ТDD освоили.

С отсутствием моков не вижу применения TDD на данной платформе.
HttpCalloutMock Interface

WebServiceMock Interface

Ну как же нету!
Другое дело я не фига не ввосторге от них.TDD обычно используется для выявления ошибок на этапе проектирования и разработки.

[quote="Gres"][quote="Sergey Prichepo"]В наших реалях хотя бы ТDD освоили.[/quote]
С отсутствием моков не вижу применения TDD на данной платформе.[/quote][url=https://www.salesforce.com/us/developer/docs/apexcode/Content/apex_classes_restful_http_testing_httpcalloutmock.htm]HttpCalloutMock Interface[/url]

[url=https://www.salesforce.com/us/developer/docs/apexcode/Content/apex_interface_webservicemock.htm]WebServiceMock Interface[/url]

Ну как же нету!
Другое дело я не фига не ввосторге от них.TDD обычно используется для выявления ошибок на этапе проектирования и разработки.

Sergey Prichepo
Gres
Sergey Prichepo
В наших реалях хотя бы ТDD освоили.

С отсутствием моков не вижу применения TDD на данной платформе.
HttpCalloutMock Interface

WebServiceMock Interface

Ну как же нету!
Другое дело я не фига не ввосторге от них.TDD обычно используется для выявления ошибок на этапе проектирования и разработки.


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

[quote="Sergey Prichepo"][quote="Gres"][quote="Sergey Prichepo"]В наших реалях хотя бы ТDD освоили.[/quote]
С отсутствием моков не вижу применения TDD на данной платформе.[/quote][url=https://www.salesforce.com/us/developer/docs/apexcode/Content/apex_classes_restful_http_testing_httpcalloutmock.htm]HttpCalloutMock Interface[/url]

[url=https://www.salesforce.com/us/developer/docs/apexcode/Content/apex_interface_webservicemock.htm]WebServiceMock Interface[/url]

Ну как же нету!
Другое дело я не фига не ввосторге от них.TDD обычно используется для выявления ошибок на этапе проектирования и разработки.[/quote]
Если это ты называешь моками, то я в печали, это максимум элементарные стабы.
TDD используется именно для разработки.

Dmitry Shnyrev
Den Brown

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

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


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

[quote="Dmitry Shnyrev"]
Den Brown

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

Я бы лучше направил твою энергию на изучения различных интеграций, чем тратил время на вопросы как усложнить себе жизнь.[/quote]
Конечно, просто необходимо шевелиться.
С Дмитрием я совершенно не согласен.
Технологии меняются, приходят новые, а базовые принципы программирования и культура написания кода остаются постоянными.

Gres
С Дмитрием я совершенно не согласен.
Технологии меняются, приходят новые, а базовые принципы программирования и культура написания кода остаются постоянными.

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

Типичный пример - недавно был у нас на проекте один товарищ (не долго) (кстати говорил что на этом форуме сидят одни школьники, поэтому тут делать нечего) дали ему сделать интеграцию с веб сервисом внешним. Он сделал - создавал несколько классов, с кучей методов которые которые дергают друг друга по цепочке отдельно для модели данных, для создания запросов, для обработки запросов, для того чтобы заставить все это работать вместе. Не спорю, это делалось по каким-то принципам и наверное должно быть круто спроектировано. Но вот товарищ ушел и кто будет во всем этом разбираться и поддерживать? И нафига такие сложности? Мне проще и думаю другим после меня будет проще сделать 1 класс с 1 методом для того чтобы дернуть веб сервис, получить данные, распарсить и сложить в базу. ВСЕ! Да, пусть таким методов будет несколько, под каждый запрос, зато все предельно просто и понятно.
И не надо говорить что это говнокод. Говнокод получается когда на проект приходят несколько умных людей. И хорошо, если они друг друга понимают или один уступает другому иначе случается жо....

[quote="Gres"]С Дмитрием я совершенно не согласен. 
Технологии меняются, приходят новые, а базовые принципы программирования и культура написания кода остаются постоянными.[/quote]
Вот тут есть одна загвоздка. Принципов проектирования куча и все хороши. И получается что знать и использовать весь этот зоопарк очень сложно и не каждому хочется. [b]Поэтому обычно программист выбирает что-то одно, вырабатывает свой любимый алгоритм проектирования и работает (продвигает) его. И что получится если встретятся два таких программиста, которые используют разные техники - ничего хорошего не будет.[/b] А так и получается. Поэтому считаю что нужно по максимуму использовать стандартный функционал фреймворков (того же Salesforce) и не городить огород. Все равно придет другой программист и все сломает.
Это не только мои наблюдений, уже сотню раз встречал замечательную мысль "используйте принципы проектирования в своих личных проектах, а чужих проектам (заказчиков) делайте проще."

Типичный пример - недавно был у нас на проекте один товарищ (не долго) (кстати говорил что на этом форуме сидят одни школьники, поэтому тут делать нечего) дали ему сделать интеграцию с веб сервисом внешним. Он сделал - создавал несколько классов, с кучей методов которые которые дергают друг друга по цепочке отдельно для модели данных, для создания запросов, для обработки запросов, для того чтобы заставить все это работать вместе. Не спорю, это делалось по каким-то принципам и наверное должно быть круто спроектировано. Но вот товарищ ушел и кто будет во всем этом разбираться и поддерживать? И нафига такие сложности? Мне проще и думаю другим после меня будет проще сделать 1 класс с 1 методом для того чтобы дернуть веб сервис, получить данные, распарсить и сложить в базу. ВСЕ! Да, пусть таким методов будет несколько, под каждый запрос, зато все предельно просто и понятно. 
И не надо говорить что это говнокод. Говнокод получается когда на проект приходят несколько умных людей. И хорошо, если они друг друга понимают или один уступает другому иначе случается жо....

Я надеюсь мои радикальные взгляды не помешают мне в будущем, поменять работу, если что?

:D Я надеюсь мои радикальные взгляды не помешают мне в будущем, поменять работу, если что?

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

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

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

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

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

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

Den Brown
Дмитрий, не сочти за труд, пожалуйста, создай тему "В поиске правильной модели WS клиента" в разделе Интеграция (этот вопрос явно заслуживатеся отдельной темы), и опиши в качестве исходного примера работу этого сервис-клиента (словами или UML схемой).

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

[quote="Den Brown"]Дмитрий, не сочти за труд, пожалуйста, создай тему "В поиске правильной модели WS клиента" в разделе Интеграция (этот вопрос явно заслуживатеся отдельной темы), и опиши в качестве исходного примера работу этого сервис-клиента (словами или UML схемой).[/quote]
Den, не стесняйся, создавай любые темы которые считаешь нужными. Если честно я уже должен тебе деньги платить за созданные тобой темы :D 

Den Brown
и опиши в качестве исходного примера работу этого сервис-клиента (словами или UML схемой)

Это ты про какой сервис тут говоришь "этого сервис-клиента"?

[quote="Den Brown"]и опиши в качестве исходного примера работу этого сервис-клиента (словами или UML схемой)[/quote]
Это ты про какой сервис тут говоришь "этого сервис-клиента"?

я прошу в теме "В поиске оптимальной модели WS клиента" описать логику, модель работы той

Dmitry Shnyrev
интеграцию с веб сервисом внешним.
, посмотреть как это там работает, и возможно найти применение этой модели, или дополнить ее

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

Вот тут увидел - наши коллеги постарались сделать видео по теме ООП
Шаблоны Проектирования ООП на Apex

Вот тут увидел - наши коллеги постарались сделать видео по теме ООП
[url=https://www.youtube.com/watch?v=PT83JXdfJf8]Шаблоны Проектирования ООП на Apex[/url]

Dmitry Shnyrev
Вот тут увидел - наши коллеги постарались сделать видео по теме ООП
Шаблоны Проектирования ООП на Apex

спасибо, посмотрел.
неплохая презентация, но есть несколько комментов:

(1) по синглтону:
а как все-таки правильнее получать Рек Тайп ID:
- просто кверить;
или
- как предложено там: Object__c.sObjectType.getDescribe().getRecordTypeInfosByName().get("sample").getRecordTypeID();

а оборачивать таким образом полученные АйДи в синглтонированный объект имеет смысл только если с этим АйДи нужно "носиться" по всему экзекюшен контектс ( получили АйДи в начале кода, а работаем с ним где-то там, а может много раз), фактически это описано в Адвансед АПЕКС апелмана, но там было без синглтона.

[quote="Dmitry Shnyrev"]Вот тут увидел - наши коллеги постарались сделать видео по теме ООП 
Шаблоны Проектирования ООП на Apex[/quote]

спасибо, посмотрел.
неплохая презентация, но есть несколько комментов:

(1) по синглтону:
 а как все-таки правильнее получать Рек Тайп ID:
- просто кверить;
или
- как предложено там: Object__c.sObjectType.getDescribe().getRecordTypeInfosByName().get("sample").getRecordTypeID();

а оборачивать таким образом полученные АйДи в синглтонированный объект имеет смысл только если с этим АйДи нужно "носиться" по всему экзекюшен контектс ( получили АйДи в начале кода, а работаем с ним где-то там, а может много раз), фактически это описано в Адвансед АПЕКС апелмана, но там было без синглтона.


(2) по Стратегии
код плохо видно (на 8.18), но как мне кажется внутри стратегии сидит простая Фабрика именно с созданием объекта "от имени", как мы обсуждали выше, и возможно что когда wilder и Gres писали что используют такую фабрику, они имелии виду именно такую Стратегию. Фактически отличие такой Стратегии от простой Фабрики - это то что тут стратегия заставлется созданние объекты что-то делать. Жаль, что автор привел пример вроде как на Апексе, но совершенно абстрактный.

(3) Декоратор - без вопросов.

(4) Фасад, все понятно, и пример с WS клиентом хороший, возможно тот сложный WS клиент, о котором упоминал Дмитрий выше - именно так и работает.

(5) Композит - как то скомкано получилось, надо еще разбираться.

(2) по Стратегии 
код плохо видно (на 8.18), но как мне кажется внутри стратегии сидит простая Фабрика именно с созданием объекта "от имени", как мы обсуждали выше, и возможно что когда wilder и Gres писали что используют такую фабрику, они имелии виду именно такую Стратегию. Фактически отличие такой Стратегии от простой Фабрики - это то что тут стратегия заставлется созданние объекты что-то делать. Жаль, что автор привел пример вроде как на Апексе, но совершенно абстрактный.

(3) Декоратор - без вопросов.

(4) Фасад, все понятно, и пример с WS клиентом хороший, возможно тот сложный WS клиент, о котором упоминал Дмитрий выше - именно так и работает. 

(5) Композит - как то скомкано получилось, надо еще разбираться.

(6) Bulk State Transition - это даже не патерн - это первая вещь котрую должен понять СФ разработчик. (пачечная обработка записей в тригере, когда в самом тригере собирается требуемая дата (обычно IDs), а потом одним листом подается в метод какого-то класса).

(6) Bulk State Transition - это даже не патерн - это первая вещь котрую должен понять СФ разработчик. (пачечная обработка записей в тригере, когда в самом тригере собирается требуемая дата (обычно IDs), а потом [u]одним листом[/u] подается в метод какого-то класса).

примеры приведенные в презентации выше основаны вот на этих примерах:
https://developer.salesforce.com/page/Apex_Design_Patterns#Strategy

возьмем пример Фабрики:

public with sharing class Geocoder {

public class NameException extends Exception{}

public static final Map<String,GeocodeService> strategies;

static{

GlobalVariable__c gv = GlobalVariable__c.getInstance('strategies');

List<String> strategyNames = new List<String>();
if(gv != null && gv.value__c != null) strategyNames = gv.value__c.split(',');

strategies = new Map<String,GeocodeService>();
for(String name : strategyNames){
try{strategies.put(name, (GeocodeService)Type.forName(name).newInstance());}
catch(Exception e){continue;} //skip bad name silently on init stage
}
}

private GeocodeService strategy;

public Geocoder(String name){
if(!strategies.containsKey(name)) throw new NameException(name); //show bad name if it does not exist (or was skiped in init stat section)
strategy = strategies.get(name);
}

public List<Double> getLatLong(String address){
return strategy.getLatLong(address);
}


}

всем хороша, но если присмотреться, то главная Мапа

public static final Map<String,GeocodeService> strategies;

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

немного переписал: теперь главная Мапа содержит Type и вместо конструктора добавил метод, который может переключать логику у текущего объекта на ходу:

public with sharing class Geocoder2 {

public class NameException extends Exception{}

public static final Map<String,Type> strategies;

static{

GlobalVariable__c gv = GlobalVariable__c.getInstance('strategies');

List<String> strategyNames = new List<String>();
if(gv != null && gv.value__c != null) strategyNames = gv.value__c.split(',');

strategies = new Map<String,Type>();
for(String name : strategyNames){
try{strategies.put(name, Type.forName(name));}
catch(Exception e){continue;} //skip bad name silently on init stage
}
}

private GeocodeService strategy;


public List<Double> getLatLong(String address){
return strategy.getLatLong(address);
}

public Geocoder2 SetLogic(String name){

if(!strategies.containsKey(name)) throw new NameException(name); //show bad name if it does not exist (or was skiped in init stat section)

Type myType= strategies.get(name);

strategy = (GeocodeService) myType.newInstance();

return this;
}

}

теперь с объектом можно так работать:

Geocoder2 geocoder = new Geocoder2().setLogic('GoogleMapsImpl');

System.debug(geocoder.getLatLong('moscone center'));

geocoder.setLogic('MapQuestImpl'); //переключаем логику в рантайме

System.debug(geocoder.getLatLong('moscone center'));

примеры приведенные в презентации выше основаны  вот на этих примерах:
https://developer.salesforce.com/page/Apex_Design_Patterns#Strategy

возьмем пример Фабрики:
[code]
public with sharing class Geocoder {

    public class NameException extends Exception{} 

    public static final Map<String,GeocodeService> strategies;

    static{ 

        GlobalVariable__c gv = GlobalVariable__c.getInstance('strategies');

        List<String> strategyNames = new List<String>();
        if(gv != null && gv.value__c != null) strategyNames = gv.value__c.split(',');

        strategies = new Map<String,GeocodeService>();
        for(String name : strategyNames){
            try{strategies.put(name, (GeocodeService)Type.forName(name).newInstance());}
            catch(Exception e){continue;} //skip bad name silently on init stage
        }
    }

    private GeocodeService strategy;

    public Geocoder(String name){
        if(!strategies.containsKey(name)) throw new NameException(name); //show bad name if it does not exist (or was skiped in init stat section)
        strategy = strategies.get(name);
    }

    public List<Double> getLatLong(String address){
        return strategy.getLatLong(address);
    }


}

[/code]

всем хороша, но если присмотреться, то главная Мапа
[code]public static final Map<String,GeocodeService> strategies;[/code]
содержит инициализированные объекты, и при этом класс в принципе может использовать только один из них.

немного переписал: теперь главная Мапа содержит Type и вместо конструктора добавил метод, который может переключать логику у текущего объекта на ходу:

[code]public with sharing class Geocoder2 {

    public class NameException extends Exception{} 

    [b]public static final Map<String,Type> strategies;[/b]

    static{

        GlobalVariable__c gv = GlobalVariable__c.getInstance('strategies');

        List<String> strategyNames = new List<String>();
        if(gv != null && gv.value__c != null) strategyNames = gv.value__c.split(',');

        strategies = new Map<String,Type>();
        for(String name : strategyNames){
            try{strategies.put(name, Type.forName(name));}
            catch(Exception e){continue;} //skip bad name silently on init stage
        }
    }

    private GeocodeService strategy;


    public List<Double> getLatLong(String address){
        return strategy.getLatLong(address);
    }

  [b] public Geocoder2 SetLogic(String name){[/b]
        
        if(!strategies.containsKey(name)) throw new NameException(name); //show bad name if it does not exist (or was skiped in init stat section)
        
        Type myType= strategies.get(name);
       
        strategy = (GeocodeService) myType.newInstance();  	
   	    
   	    return this;
   }

}[/code]

теперь с объектом можно так работать:

[code]
Geocoder2 geocoder = new Geocoder2().setLogic('GoogleMapsImpl');

System.debug(geocoder.getLatLong('moscone center'));

geocoder.setLogic('MapQuestImpl'); //переключаем логику в рантайме

System.debug(geocoder.getLatLong('moscone center'));
[/code]

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

вот у менят есть тригер на Аттачментах, который ловит Аттачи от нескольких объектов и что то делает (делает похожую логику, но немного отличающуюся от объекта к объекту). Проблема в том, что в данном приложении постоянно прибывает объектов, которые должны отработь эту логику. Тригер приходится постоянно дописывать, дописывать тест, тащить все в прод.

А я мог бы в тригере провести начальную проверку условий и передать Аттачи в класс-фабрику, которая по API имени объета-родителя инициировала нужный "рабочий" объект и заставляла его отработать нужную логику.

в таком случае, если в тригер нужно добавить модуль по работе с новым объектом, то просто пишется "рабочий" класс, переносится в Прод, и в кастомный настройкая добавляется подстрока ",NewCustomObject__c".
И все.

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

вот у менят есть тригер на Аттачментах, который ловит Аттачи от нескольких объектов и что то делает (делает похожую логику, но немного отличающуюся от объекта к объекту). Проблема в том, что в данном приложении постоянно прибывает объектов, которые должны отработь эту логику. Тригер приходится постоянно дописывать, дописывать тест, тащить все в прод.

А я мог бы в тригере провести начальную проверку условий и передать Аттачи в класс-фабрику, которая по API имени объета-родителя инициировала нужный "рабочий" объект и заставляла его отработать нужную логику.

в таком случае, если в тригер нужно добавить модуль по работе с новым объектом, то просто пишется "рабочий" класс, переносится в Прод, и в кастомный настройкая добавляется подстрока ",NewCustomObject__c".
И все.



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

вот у менят есть тригер на Аттачментах, который ловит Аттачи от нескольких объектов и что то делает (делает похожую логику, но немного отличающуюся от объекта к объекту). Проблема в том, что в данном приложении постоянно прибывает объектов, которые должны отработь эту логику. Тригер приходится постоянно дописывать, дописывать тест, тащить все в прод.

А я мог бы в тригере провести начальную проверку условий и передать Аттачи в класс-фабрику, которая по API имени объета-родителя инициировала нужный "рабочий" объект и заставляла его отработать нужную логику.

в таком случае, если в тригер нужно добавить модуль по работе с новым объектом, то просто пишется "рабочий" класс, переносится в Прод, и в кастомный настройкая добавляется подстрока ",NewCustomObject__c".
И все.


Почитай еще про инъекцию зависимостей и принципы S.O.L.I.D., я думаю, тебе будет очень интересно.

[quote="Den Brown"]Наконец-то я понял, что такая фабрика позволяет расширять (дополнять новыми вариантами действий) какой-то код без малейших изменений в нем. настоящая модульность.

вот у менят есть тригер на Аттачментах, который ловит Аттачи от нескольких объектов и что то делает (делает похожую логику, но немного отличающуюся от объекта к объекту). Проблема в том, что в данном приложении постоянно прибывает объектов, которые должны отработь эту логику. Тригер приходится постоянно дописывать, дописывать тест, тащить все в прод.

А я мог бы в тригере провести начальную проверку условий и передать Аттачи в класс-фабрику, которая по API имени объета-родителя инициировала нужный "рабочий" объект и заставляла его отработать нужную логику.

в таком случае, если в тригер нужно добавить модуль по работе с новым объектом, то просто пишется "рабочий" класс, переносится в Прод, и в кастомный настройкая добавляется подстрока ",NewCustomObject__c".
И все.[/quote]
Почитай еще про инъекцию зависимостей и принципы S.O.L.I.D., я думаю, тебе будет очень интересно.

Gres
Почитай еще про инъекцию зависимостей и принципы S.O.L.I.D.

ОК, ждем следующих выходных

[quote="Gres"]Почитай еще про инъекцию зависимостей и принципы S.O.L.I.D.[/quote]

ОК, ждем следующих выходных

А ночь тебе зачем ?

А ночь тебе зачем ? :D 

Den Brown
ОК, ждем следующих выходных

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

[quote="Den Brown"]ОК, ждем следующих выходных[/quote]
Кст, ты просто читаешь или еще и тренируешься, т.е. пишешь какой-то код?
Если пишешь, то можно выложить проект на гитхаб и там запилить набор используемых тобой паттернов.

Gres
Кст, ты просто читаешь или еще и тренируешься, т.е. пишешь какой-то код?

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

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

УРА! Теперь и я могу считать себя образованным - нашел как по научному называется принцип проектирования, который использую я KISS

KISS (англ. keep it simple, stupid — буквально — «делай это проще, тупица» или более вежливый вариант англ. keep it short and simple — «делай короче и проще») — процесс и принцип проектирования,[1] при котором простота системы декларируется в качестве основной цели и/или ценности. Имеют хождение разные расшифровки этого акронима. Эрик Рэймонд в своей книге резюмирует философию UNIX как широко используемый принцип KISS.

УРА! Теперь и я могу считать себя образованным :) - нашел как по научному называется принцип проектирования, который использую я :) [b][url=http://en.wikipedia.org/wiki/KISS_principle]KISS[/url][/b]
[quote]KISS (англ. keep it simple, stupid — буквально — «делай это проще, тупица» или более вежливый вариант англ. keep it short and simple — «делай короче и проще») — процесс и принцип проектирования,[1] при котором простота системы декларируется в качестве основной цели и/или ценности. Имеют хождение разные расшифровки этого акронима. Эрик Рэймонд в своей книге резюмирует философию UNIX как широко используемый принцип KISS.[/quote]

О, получается я тоже!

О, получается я тоже!