ינון קונספט
(שולח גירסא מתוקנת כי המקורי לא יצא טוב במייל)
ישבתי השבוע לעבוד בקניון בכפר סבא והקניון באמת נטוש ובקומה הראשונה שלו יש מסעדה בשם שגב קונספט. הקונספט של שגב זה להגיש מנות דומות אבל שונות, שכאילו יש להן את אותו רעיון בסיסי למשל קונספט כיסונים ואז כל מיני מנות שקשורות לכיסונים.
לא הכי הבנתי את הקונספט וממילא ויתרתי על שגב וישבתי לעבוד בארומה אבל אז הבנתי שיש משהו בקונספט הזה של שגב. במיוחד אם מיישמים את זה על שפות תכנות.
קחו למשל את הקונספט של תכנות פונקציונאלי: כתיבת התוכנית כרצף של פעולות קטנות על מידע בלי לשנות את המידע עצמו כך שאפשר לחזור על החישוב שוב ושוב. הרבה שפות תכנות תומכות בקונספט הזה בצורות שונות. לדוגמא התוכנית הבאה מחפשת את המילה הארוכה ביותר בקובץ בשפת פייתון:
import fileinput
from functools import reduce
from itertools import chain
def longer(acc, val):
if len(acc) > len(val):
return acc
else:
return val
def flatten(listOfLists):
return chain.from_iterable(listOfLists)
print(
reduce(
longer,
flatten(
map(
lambda s: s.split(),
fileinput.input()
)
)
)
)
ואותה התוכנית בשפת Ruby:
class String
def longer(other)
length > other.length ? self : other
end
end
puts ARGF.flat_map(&:split).reduce(&:longer)
ואותה התוכנית בשפת Elixir:
defmodule My do
def longer(val, acc) do
if String.length(acc) > String.length(val) do
acc
else
val
end
end
end
IO.stream(:stdio, :line)
|> Enum.flat_map(&String.split/1)
|> Enum.reduce(&My.longer/2)
|> IO.puts
ואפילו שהמילים קצת שונות נורא ברור לנו שאם אנחנו מבינים אחת מהן יהיה לנו מאוד קל להבין את האחרות. תקשיבו לשגב: כשאתם מבינים את הקונספט יהיה לכם הרבה יותר קל ללמוד את הדבר הגדול הבא.
נ.ב. כשסימן ה Pipeline יגיע מאליקסיר ל JavaScript ותתחילו לראות אותו בתוכניות של כל הילדים המגניבים תזכרו איפה קראתם עליו פעם ראשונה.