Loop for vs Map reduce

Chokchai Phatharamalai
odds.team
Published in
2 min readOct 24, 2019

ตอนผมกำลังทำ Programming Kata ชื่อ Ascending List ซึ่งเอาไว้เช็คว่า Array ที่รับเข้ามาเนี่ย element แต่ละตัวเพิ่มขึ้นเรื่อย ๆ ไหม? ผมเจอโค้ดที่น่าสนใจมาก code version แรกหน้าตาแบบนี้

For-loop แบบมี return

code นี้มี smell หนึ่งที่ขัดใจผม คือ ผมต้องพิมพ์คำว่า true กับ false ลงไป

Terry เคยสอนผมไว้ว่าเมื่อไหร่ที่รู้ตัวว่าพิมพ์ true หรือ false ให้สงสัยว่าตัวเองกำลังทำอะไรผิดซักอย่าง

Terry and Aki. Source: https://www.odd-e.jp/news_20180228/

When you find yourself typing true or false, you probably doing something wrong. true and false are meant to be used as a concept, not primitive type.— Terry Yin

พอเอาไปปรึกษาเพื่อน ๆ ใน Odd-e ก็ได้โค้ดน่ารัก ๆ จาก Bas Vodde มา

a == a

ตึ่งโป๊ะ!

พอ Terry กับ Viktor เห็น code ก็พูดเป็นเสียงเดียวกันว่าให้ใช้ recursion พอลองดูได้โค้ดแบบข้างล่าง

recursion

ตอนนี้ผมจดไว้ในใจว่า ถ้าเจอ return ใน loop for ให้ลองคิดถึง recursion ดู

ท่านี้ทำให้ false หายไปละ เหลือ true อยู่ แต่เป็น true ที่ผม ok นะ เพราะมัน capture requirement ว่า ถ้าเป็น array เปล่า หรือว่าไม่มีคนให้เปรียบเทียบ (มีตัวเดียว) ให้ถึงว่าเป็น true ได้ดี

แต่เราไม่หยุดแค่นั้น Terry ให้ code python มาว่า ถ้าเป็นใน python เค้าจะเขียนประมาณนี้ all([x>y for x,y in zip(a[1:], a[:-1])])

หนึ่งบรรทัดใน python นั้น ผมแปลงเป็น javascript ได้แบบข้างล่าง

1 บรรทัดใน python…

true กับ false หายไปละ แต่ผมก็อดสงสัยว่ามันใช้ map, reduce ได้ไหมนะ? แล้ว code ของ Steven ก็เฉลยว่าทำได้ แต่ก่อนจะไปดูท่า map reduce เราต้องมา refactor เพื่อเอา return ออกไปจาก loop for ก่อน (ไม่งั้น map ไม่ได้)

เสร็จแล้วก็ลอง map reduce ดู

map reduce

เป็นตรงที่ผมจดในใจว่า จะ map reduce ได้ ต้องเอา return ออกจาก loop for ก่อน

สรุป

ไม่รู้ถูกไหม แต่ตอนนี้ผมจดเพิ่มจากให้ระวังตอนพิมพ์ true กับ false ว่า

ถ้าวน loop แล้วในนั้นมี return ให้ลองนึกถึง recursion ดู

ถ้าในนั้นไม่มี return ให้ลองนึกถึง map, reduce

Credits

Terry, Bas, Viktor, Steven for joining my discussion. ;)

--

--