Скромний об'єкт (шаблон проєктування)

Скромний об'єкт (англ. 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>

Джерела ред.