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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

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

Джерела[ред. | ред. код]