Не разговаривай с незнакомцами!

Каждый ребенок знает: Не разговаривайте с незнакомцами! Но потом этот ребенок вырастает, заканчивает среднюю школу, поступает в колледж/университет, изучает информатику/программную инженерию и забывает. Этот ребенок, теперь iOS-разработчик, получил задание. Ему нужно реализовать UITableView для элементов ToDo. И вот что он написал, используя необходимые делегаты:

Конечно. это конечно работает. Некоторые из вас остановятся здесь. НО! Эта реализация нарушает закон. Закон «Не разговаривай с незнакомцами», также известный как Закон Деметры.

Основные принципы:

  • Каждый блок должен иметь лишь ограниченные знания о других блоках: только блоки, "тесно" связанные с текущим блоком.
  • Каждый юнит должен разговаривать только со своими друзьями; не разговаривайте с незнакомцами.
  • Разговаривайте только со своими ближайшими друзьями.

В приведенном выше примере кода вы должны заметить следующее:

  • В методе numberOfRowsInSection мы переходим к подсчету свойства в массиве toDoItems в классе ToDoItemsModel.
  • В методе cellForRowAt мы переходим к именам toDoItems в массиве toDoItems класса ToDoItemsModel.
  • Класс ToDoItemsListDataProvider слишком много знает о ToDoItemsModel. Это приводит к более тесному взаимодействию, что всегда плохо.

Итак, теперь, после нескольких исправлений, это выглядит так:

Итак, здесь мы имеем усовершенствование, которое в точности соответствует Закону Деметры на практике. мы используем новый уровень абстракций, предоставляемый классом ToDoItemsModel. Мы можем получить то, что нам нужно, без прямого доступа к массиву toDoItems в ToDoItemsModel. После этих изменений мы имеем гораздо более чистое разделение и, как следствие, более гибкую систему.