„Практически обектно-ориентиран дизайн в Ruby“ от Санди Мец е една от любимите ми книги за програмиране. В тези страници има много мъдрост и тя оказа доста голямо влияние върху стила ми на програмиране.
Тази книга е мястото, където научих за модела на шаблонния метод. За тези, които не знаят, това се състои в деклариране на родителски класове или модули на методи, които трябва да бъдат презаписани от неговите наследници:
Тук Bicycle
декларира default_tire_size
с цел да позволи на своите потомци да го декларират. В случай, че разработчикът забрави да го направи, съобщението за грешка ще ни подскаже какво наистина не е наред. Много ми харесва идеята за шаблонния метод.
Има обаче нещо, което открих, че не е наред с тази специфична реализация на метода на шаблона в Ruby. И това е, че NotImplementedError
не е правилният избор за шаблонен метод, тъй като не е наследник на StandardError
.
Като прочетете Програмиране на Ruby от Дейв Томас (друга отлична книга), в глава 10.1 ще намерите следното:
Направете свои собствени подкласове за изключения на StandardError или едно от
неговите деца. Ако не го направите, вашите изключения няма да бъдат уловени по подразбиране.
И като прочетете документите на Ruby, ще откриете истинската цел наNotImplementedError
:
Повишава се, когато функция не е внедрена на текущата платформа. Например, методи, зависещи от системните извиквания
fsync
илиfork
, могат да предизвикат това изключение, ако основната операционна система или Ruby runtime не ги поддържа.
Това очевидно не е това, което имахме предвид, когато го използвахме в предишния пример. И както бяхме предупредени, Ruby няма да спаси ScriptError
по подразбиране:
Какво мога да направя? Всъщност харесвам NoMethodError
. Мисля, че изразява добре какво означава. И ако това не е достатъчно конкретно, винаги можете да използвате съобщението:
Благодаря ви, че прочетохте.