Чистый способ настройки ячейки в архитектуре mvp

#ios #swift

Вопрос:

У меня есть функция для ячейки представления таблицы, но у нее много обязанностей:

  1. форматирование данных (я делаю это с расширением для даты)
  2. настройка текста для надписей
  3. скрытие/отображение изображений хода выполнения (называемых параметрами) зависит от количества строк с расширением
  4. проверка, относится ли последняя сохраненная запись к сегодняшнему дню (если да, измените текстовые метки)

    класс tableViewCell ниже

       func setProgressParameteres(positive: Bool) {
             if positive {
                 arrowProgress.image = UIImage(systemName: Images.arrowUp)
                 arrowProgress.tintColor = .green
                 weightProgress.textColor = .green
             } else {
                 arrowProgress.image = UIImage(systemName: Images.arrowDown)
                 arrowProgress.tintColor = .red
                 weightProgress.textColor = .red
             }
         }
    
         func configureCell(tableViewData: [BodyWeightCalendarModel], indexPath: IndexPath) {
    
             //formatted retrieved date
    
             let formattedDateWithTime = tableViewData[indexPath.row].date.getFormattedDate(format: DateFormats.formatDayMonthTime)
    
             let formattedDate = tableViewData[indexPath.row].date.getFormattedDate(format: DateFormats.formatYearMonthDay)
    
             let weight = String(tableViewData[indexPath.row].weight)
    
             weightValue.text = "(weight) (weightUnit)"
    
             //Hide progress parameters if first row selected
             if indexPath.row == tableViewData.count - 1 {
                 hideProgressParameters(bool: true)
             } else {
                 let progressValue = tableViewData[indexPath.row].weight - tableViewData[indexPath.row   1].weight
    
                 let progressValueString = String(format: "%.1f", progressValue)
    
                 weightProgress.text = ("(progressValueString) kg")
    
                 //Check if progression is on   or -
                 if progressValue > 0 {
                     setProgressParameteres(positive: true)
                 } else {
                     setProgressParameteres(positive: false)
                 }
                 hideProgressParameters(bool: false)
             }
    
             // Check if last record is from today
             if formattedDate == todayDate {
                 dayLabel.text = "Today"
             } else {
                 dayLabel.text = formattedDateWithTime
    
    
               }
     

    }

Интересно, какой лучший вариант сделать этот код чище? Создайте небольшую функцию и вызовите их все в configureCell или, может быть, создайте новый TableViewCellPresenter только для этой ячейки и передайте всю эту логику этому докладчику?

Комментарии:

1. Вы можете просто указать по крайней мере одну часть кода, указав своему форматору даты использовать относительное форматирование, тогда вы автоматически получите «сегодня», «вчера», «Воскресенье» и т. Д.

2. Кроме того, если этот код находится в вашей ячейке, он находится в неправильном месте. Ячейка не должна знать о своем номере строки, и вам не нужно передавать весь массив табличных данных. Создание расширения Date для форматирования дат с использованием DateFormatter также кажется чрезмерно сложным. Похоже, вы могли бы поместить большую часть этого кода в вычисляемые свойства объекта модели представления, который вы передаете в ячейку

3. Вы также можете использовать мощные Measurement классы Swift для своих весов; Если вы создадите измерение веса, оно может быть автоматически отформатировано с учетом региональных особенностей (кг в метрических единицах измерения, фунты в имперских единицах измерения).

4. Вопросы о коде, который работает, но который вы хотите улучшить, можно задать по адресу codereview.stackexchange.com

5. ДА. Ячейка-это представление. Ваш контроллер представления или модель представления должны передавать ему необходимые данные. Он не должен содержать никакой вычислительной логики. Конечно, это возможно , как вы уже сделали. Это просто вопрос стиля. Лично я бы не стал связывать данные ячейки и модели таким образом.