Така че си седя програмист на 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)
Свързани статии