„Практически обектно-ориентиран дизайн в Ruby“ от Санди Мец е една от любимите ми книги за програмиране. В тези страници има много мъдрост и тя оказа доста голямо влияние върху стила ми на програмиране.

Тази книга е мястото, където научих за модела на шаблонния метод. За тези, които не знаят, това се състои в деклариране на родителски класове или модули на методи, които трябва да бъдат презаписани от неговите наследници:

Тук Bicycle декларира default_tire_size с цел да позволи на своите потомци да го декларират. В случай, че разработчикът забрави да го направи, съобщението за грешка ще ни подскаже какво наистина не е наред. Много ми харесва идеята за шаблонния метод.

Има обаче нещо, което открих, че не е наред с тази специфична реализация на метода на шаблона в Ruby. И това е, че NotImplementedError не е правилният избор за шаблонен метод, тъй като не е наследник на StandardError.

Като прочетете Програмиране на Ruby от Дейв Томас (друга отлична книга), в глава 10.1 ще намерите следното:

Направете свои собствени подкласове за изключения на StandardError или едно от
неговите деца. Ако не го направите, вашите изключения няма да бъдат уловени по подразбиране.

И като прочетете документите на Ruby, ще откриете истинската цел наNotImplementedError:

Повишава се, когато функция не е внедрена на текущата платформа. Например, методи, зависещи от системните извиквания fsync или fork, могат да предизвикат това изключение, ако основната операционна система или Ruby runtime не ги поддържа.

Това очевидно не е това, което имахме предвид, когато го използвахме в предишния пример. И както бяхме предупредени, Ruby няма да спаси ScriptError по подразбиране:

Какво мога да направя? Всъщност харесвам NoMethodError. Мисля, че изразява добре какво означава. И ако това не е достатъчно конкретно, винаги можете да използвате съобщението:

Благодаря ви, че прочетохте.