Какова альтернатива чрезмерному использованию оператора точки в Obj-C? - PullRequest
4 голосов
/ 15 мая 2009

Посмотрите, что вы думаете об этой строке кода:

if ([pickerViewController.picker.bvc.currentResolve.name isEqualToString:message])
  ...

Считаете ли вы это чрезмерным использованием оператора точки?

Если нет, я могу оставить все как есть.

Но если так, то какая предпочтительная альтернатива?

Ответы [ 5 ]

10 голосов
/ 15 мая 2009

Это скорее нарушение закона Деметры , чем проблема с оператором точки. «Чистым» способом сделать это было бы дать объекту логику, чтобы понять это самому, чтобы вы могли сделать что-то вроде

if ([pickerViewController hasPickedName:message])
0 голосов
/ 15 мая 2009

Я согласен с Чаком и комментаторами. Ваш метод зависит от слишком многих других объектов, но установка hasPickedName: на pickerViewController означает, что pickerViewController все равно придется каким-то образом [picker.bvc.currentResolve.name isEqualToString:message].

Вместо этого вы можете поместить hasPickedName: в bvc и внедрить bvc в качестве делегата (возможно, набрал id<NamePickerDelegate>) в ваш объект верхнего уровня с помощью Interface Builder. Чтобы быть действительно Demeter-совместимым, заставьте currentResolve вырастить метод nameMatches:, который сокращает [currentResolve.name isEqualToString:message].

Вы должны внимательно посмотреть на сложность, вызванную проблемой, на сложность, которая будет представлена ​​каждым решением. Если вы считаете, что исходный код проще и проще в обслуживании, чем альтернативы, сохраните его.

0 голосов
/ 15 мая 2009

Я считаю, что отладка такого рода вещей всегда доставляет больше хлопот, чем стоит, поэтому я склонен создавать промежуточные переменные для каждого доступа к свойству. Или, как предложили другие, реорганизовать это так, чтобы на сайте использования это выглядело проще (путем добавления смартов в метод).

0 голосов
/ 15 мая 2009

До тех пор, пока каждое использование оператора точки действительно выбирает свойство (т. Е. Не метод, который в основном занимается выполнением работы для целей, отличных от возврата значения), то это нормально. Фактически, если вы загляните в блог Уилла Шипли, он на самом деле является поклонником объединения столько вызовов функций в одну строку, сколько необходимо (ему не нравится чрезмерное использование локальных переменных).

0 голосов
/ 15 мая 2009

Я не думаю, что существует чрезмерное использование записи о свойствах. Если объект имеет свойство, доступ к нему как таковой; он демонстрирует читателю, что означает программист.

О, и упреждающая бригада "выглядит как структура"; если вы не можете отличить структуру от объекта в вашем коде, выполните рефакторинг кода.

...