ПредишенСледващото

Така че си седя програмист на Haskell. Тук той е подходящ за управителя и каза, казват те, ние трябва да се научат да пекат хляб. Като цяло, наистина нищо не е ясно, но се нуждаем от време, така че е необходимо да:

данни Хляб Хляб =

По-късно стана известно, че хляб, се оказва, тя трябва да се пече във фурната:

данни на пещта = Фурна
данни Хляб Хляб =

createBread. Фурна -> Хляб
createBread _ = Хляб

Както можете да видите, толкова дълго, тъй като е малко по които засегнатите. Както е фактът, че пещта може да бъде от различни видове:

данни Фурна = ElectricOven | GasOven | микровълнова фурна
данни Хляб Хляб =

createBread. Фурна -> Хляб
createBread _ = Хляб

Първият от тях е наистина повече или по-малко интересно е, че състоянието на фурна газ не може да се пече без газ:

данни GasStatus = GasAvailable | GasUnavailable
данни Фурна = ElectricOven | GasOven | микровълнова фурна
данни Хляб Хляб =

breadCouldBeCreated GasOven GasUnavailable = False
breadCouldBeCreated _ _ = True

createBread газова фурна
| breadCouldBeCreated газова фурна = Просто Хляб
| в противен случай = Нищо

тип "състояние на газ" е въведен тук. Газ - това е било там, или не е. Ако използваме газови бутилки, можете да съхранявате на размера на наличната газ в литри, същността остава същата. breadCouldBeCreated функция проверява дали можем да се готви нещо при сегашните обстоятелства (наличие на газ и тип пещ).

По-късно стана известно, че в допълнение към хляба във фурната и вие може да готви сладкиши и торти с различни пълнежи:

данни плънка = Месо | зеле
данни на храните = торта | Хляб | пастообразни плънка
данни GasStatus = GasAvailable | GasUnavailable
данни Фурна = ElectricOven | GasOven | микровълнова фурна

ovenCouldBeUsed GasOven GasUnavailable = False
ovenCouldBeUsed _ _ = True

създаване на газова готварска печка храна
| ovenCouldBeUsed газова фурна = Просто храна
| в противен случай = Нищо

Представяме на видовете "храна" и "пълнеж". BreadCouldBeCreated преименувате функция в ovenCouldBeUsed.

Сега, мениджърът иска да кейкове, пайове и хляб изпечен за причина и за най-различни рецепти. Каза - готови с:

данни плънка = Месо | зеле
данни на храните = торта | Хляб | пастообразни плънка
данни GasStatus = GasAvailable | GasUnavailable
данни Фурна = ElectricOven | GasOven | микровълнова фурна

ovenCouldBeUsed GasOven GasUnavailable = False
ovenCouldBeUsed _ _ = True

създаване на газова готварска печка храна
| ovenCouldBeUsed газова фурна = Просто храна
| в противен случай = Нищо

breadRecipe = създаде Хляб
cakeRecipe = създадат торта
pastyRecipe плънка = създаде $ Паста плънка

Рецепта обикновено изисква извършването на някакво действие със съставки, фурна и така нататък. Очевидно е, че рецептата е функция от по-висок ред.

И накрая, в пещите е необходимо да се пекат тухли. Ако се съди по текста, пекат тухли трябва да са в една и съща пещ с микровълнова фурна (макар и отделен клас Furnace е въведена в статията за Хабре):

данни плънка = Месо | зеле
данни на храните = торта | Хляб | пастообразни плънка
данни GasStatus = GasAvailable | GasUnavailable
данни Фурна = ElectricOven | GasOven | микровълнова фурна
данни Панел = Панел

ovenCouldBeUsed GasOven GasUnavailable = False
ovenCouldBeUsed _ _ = True

създаване на газова готварска печка храна
| ovenCouldBeUsed газова фурна = Просто храна
| в противен случай = Нищо

breadRecipe = създаде Хляб
cakeRecipe = създадат торта
pastyRecipe плънка = създаде $ Паста плънка

газ makeBrick фурна
| ovenCouldBeUsed газова фурна = Просто Тухла
| в противен случай = Нищо

Ние просто добавя тип "тухла" и функция "правят тухли".

Заключенията се показват. Ние получаваме един прост за разбиране и лесни за поддържане код. В процеса на писане, ние лесно и естествено се изгради модел на домейн, в действителност просто направи превода от руски на Haskell. Без никакво наследствата, рефакториране и UML.

Може би, в действителност, означава, че всяка пещ произвежда хляб и сладкиши са малко по-различни, и ние трябва да се въведат допълнителни видове клас (или, ако предпочитате, на "интерфейс") със съответната инстанция на класа. В същото време ние не трябва ръчно да се кодират поканата ovenCouldBeUsed където се използва пещ. Но това не изглежда, че решението значително усложнява от всичко това.

И как да се пекат хляб?

Подобно на този пост? Споделете с другите:

(Трябва да включите JS)

Свързани статии

Подкрепете проекта - споделете линка, благодаря!