У мене є веб-додаток. Я не вважаю, що технологія важлива. Структура - це N-ярусна програма, показана на зображенні зліва. Є 3 шари.
Користувальницький інтерфейс (MVC-шаблон), бізнес-логічний шар (BLL) та шар доступу до даних (DAL)
Проблема, яку я маю, - це мій BLL - масивна, оскільки вона має логіку та шляхи виклику подій програми.
Типовим потоком через додаток може бути:
Подія, запущена в інтерфейсі користувача, переходить до методу в BLL, виконує логіку (можливо, в декількох частинах BLL), врешті-решт, в DAL, назад в BLL (де можливо більше логіки), а потім повертає деяке значення в інтерфейс користувача.
BLL в цьому прикладі дуже зайнятий, і я думаю, як це розділити. У мене також є логіка і об'єкти, що поєднуються, які мені не подобаються.
Версія праворуч - це мої зусилля.
Логіка ще як потоки додатків між UI і DAL, але не можливо ніяких властивостей ... Тільки методи (більшість класів в цьому шарі може можливо бути статичним , оскільки вони не зберігають стан). Шар Poco - це те, де існують класи, які мають властивості (наприклад, клас Person, де було б ім'я, вік, зріст тощо). Вони не мають нічого спільного з потоком програми, вони лише зберігають стан.
Потік може бути:
Навіть спрацьовує з інтерфейсу користувача та передає деякі дані контролеру шару інтерфейсу (MVC). Це переводить необроблені дані та перетворює їх у модель poco. Потім модель poco передається в рівень Logic (який був BLL) і, врешті-решт, в рівень запиту команд, потенційно маніпулюючи по дорозі. Рівень запиту Command перетворює POCO в об'єкт бази даних (майже однакове, але один призначений для стійкості, інший для переднього кінця). Елемент зберігається, а об’єкт бази даних повертається до рівня «Запит запитів команд». Потім він перетворюється в POCO, де він повертається до рівня Logic, потенційно обробляється далі, а потім, нарешті, назад до інтерфейсу користувача
Спільна логіка та інтерфейси - це те, де ми можемо мати стійкі дані, такі як MaxNumberOf_X та TotalAllowed_X та всі інтерфейси.
І спільна логіка / інтерфейси, і DAL є "базою" архітектури. Вони нічого не знають про зовнішній світ.
Все знає про poco, крім спільної логіки / інтерфейсів та DAL.
Потік все ще дуже схожий на перший приклад, але це робить кожен шар більш відповідальним за 1 річ (будь то стан, потік чи щось інше) ... але чи я порушую OOP таким підходом?
Прикладом демонстрації Logic і Poco може бути:
public class LogicClass
{
private ICommandQueryObject cmdQuery;
public PocoA Method1(PocoB pocoB)
{
return cmdQuery.Save(pocoB);
}
/*This has no state objects, only ways to communicate with other
layers such as the cmdQuery. Everything else is just function
calls to allow flow via the program */
public PocoA Method2(PocoB pocoB)
{
pocoB.UpdateState("world");
return Method1(pocoB);
}
}
public struct PocoX
{
public string DataA {get;set;}
public int DataB {get;set;}
public int DataC {get;set;}
/*This simply returns something that is part of this class.
Everything is self-contained to this class. It doesn't call
trying to directly communicate with databases etc*/
public int GetValue()
{
return DataB * DataC;
}
/*This simply sets something that is part of this class.
Everything is self-contained to this class.
It doesn't call trying to directly communicate with databases etc*/
public void UpdateState(string input)
{
DataA += input;
}
}