Почему "call super" считается анти-шаблоном согласно Википедии? [закрытый]

Википедия классифицирует "вызов супер" как анти-шаблон, и я действительно не понимаю, почему. Шаблон используется довольно часто в objective-C/cocoa; например, init / dealloc, drawrect, awakefromnib все требуют вызова super. Я неправильно понял концепцию?

ссылка на статью: http://en.wikipedia.org/wiki/Call_super

2 ответов


Как говорится в статьи это необходимость чтобы вызвать супер метод, который является антипаттерном, т. е. супер класс "ожидает", что вы переопределите метод, чтобы сделать функциональность полной, но он делает это, не делая это ожидание явным. И он также ожидает, что вы позвоните в super implementation. И то и другое необходимо для работы программы.

это антипаттерн, потому что намерение программист не может быть выведено из кода. Если ваши коллеги решили работать над этим, они не будут знать, что вы ожидаете от класса, и поэтому могут столкнуться с проблемами и/или раздражениями.

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

Objective-C не имеет абстрактных или виртуальных методов, но вы можете достичь того же эффекта, явно подняв исключение, если вызывается метод super. Таким образом, если ваши коллеги забудут переопределить метод, программа рухнет-и она рухнет с сообщением об ошибке, которое они поймут, и это позволит им понять и исправить проблему быстрее и легче, чем какое - то неустойчивое поведение без объяснения причин, из-за неполной функциональности.


суть проблемы:

..Однако тот факт, что сам язык может быть не в состоянии принудительное выполнение всех условий, предписанных в этом вызове, делает это антишаблон.

таким образом, авторы анально о программистах, которые должны сделать что-то, что, по их мнению, язык должен сделать для них.

решение, упомянутое в статье wikepedia Вызов Супер - это:

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

проблема в том, что Objective-c не имеет виртуальных функций. В нем есть только сообщения, поэтому вы не можете реализовать то, что предлагает wikepedia.