Скромний об'єкт (шаблон проєктування)
Скромний об'єкт (англ. Humble Object) — шаблон проєктування, який дозволяє відокремити поведінку, що легко піддається тестуванню від поведінки, яка насилу піддається тестуванню..
Опис[ред. | ред. код]
Нехай, необхідно протестувати логіку, яка важко піддається тестування, наприклад, логіку графічного інтерфейсу. Такі дані складні тому, що важко писати тести, які можуть бачити зображення на екрані і перевіряти присутність відповідних елементів. Однак насправді поведінку інтерфейсу легко тестувати, оскільки просто необхідно перевірити правильність самих елементів відображення.
Ідея шаблону у тому щоб розділити логіку на два модулі: "скромний" модуль складний для тестування, але він містить лише просту поведінку та складніший модуль, який містить тестовану поведінку.
Реалізація[ред. | ред. код]
Нехай, необхідно протестувати графічний інтерфейс.
Згідно з цим шаблоном розділимо поведінку на презентатор (Presenter) і представлення (View).
Представлення (View) - це "скромний" об'єкт, складний для тестування. Код у цьому об'єкті дуже спрощений. Він просто переносить дані у графічний інтерфейс, жодним чином не обробляючи їх.
Презентатор (Presenter) - це легко тестований об'єкт. Його завдання — отримати дані від програми і перетворити їх так, щоб Представлення (View) могло просто перемістити їх на екран.
Наприклад, якщо застосунку треба відобразити дату в певному полі, він має передати презентатору об'єкт дати.
public class HomeController
{
public ActionResult Index()
{
var date = DateTime.Now;
var presenter = new HomePresenter()
var viewModel = presenter.IndexPage(date);
return View("Index", viewModel);
}
}
Презентатор потім повинен перетворити дату на рядок і помістити її в просту структуру даних, яку називають моделлю представлення (View Model).
public class IndexViewModel
{
public string DateString { get; set; }
public string DateColor { get; set; }
}
public class HomePresenter
{
public IndexViewModel IndexPage(DateTime dateTime)
{
return new IndexViewModel
{
DateString = dateTime.ToLongDateString(),
DateColor = dateTime.DayOfWeek == System.DayOfWeek.Sunday ? "red" : "green",
};
}
}
Тоді представлення зможе знайти і відобразити дані моделі.
@model IndexViewModel
<p>
<time style="color: @Model.DateColor">@Model.DateString</time>
</p>
Джерела[ред. | ред. код]
- Humble Object pattern [Архівовано 27 вересня 2020 у Wayback Machine.]
- Humble Object Pattern for UIViewController