Loop for vs Map reduce
ตอนผมกำลังทำ Programming Kata ชื่อ Ascending List ซึ่งเอาไว้เช็คว่า Array ที่รับเข้ามาเนี่ย element แต่ละตัวเพิ่มขึ้นเรื่อย ๆ ไหม? ผมเจอโค้ดที่น่าสนใจมาก code version แรกหน้าตาแบบนี้
code นี้มี smell หนึ่งที่ขัดใจผม คือ ผมต้องพิมพ์คำว่า true
กับ false
ลงไป
Terry เคยสอนผมไว้ว่าเมื่อไหร่ที่รู้ตัวว่าพิมพ์ true
หรือ false
ให้สงสัยว่าตัวเองกำลังทำอะไรผิดซักอย่าง
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 มา
ตึ่งโป๊ะ!
พอ Terry กับ Viktor เห็น code ก็พูดเป็นเสียงเดียวกันว่าให้ใช้ 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 ได้แบบข้างล่าง
true
กับ false
หายไปละ แต่ผมก็อดสงสัยว่ามันใช้ map, reduce ได้ไหมนะ? แล้ว code ของ Steven ก็เฉลยว่าทำได้ แต่ก่อนจะไปดูท่า map reduce เราต้องมา refactor เพื่อเอา return
ออกไปจาก loop for ก่อน (ไม่งั้น map ไม่ได้)
เสร็จแล้วก็ลอง map reduce ดู
เป็นตรงที่ผมจดในใจว่า จะ map reduce ได้ ต้องเอา return
ออกจาก loop for ก่อน
สรุป
ไม่รู้ถูกไหม แต่ตอนนี้ผมจดเพิ่มจากให้ระวังตอนพิมพ์ true
กับ false
ว่า
ถ้าวน loop แล้วในนั้นมี return
ให้ลองนึกถึง recursion ดู
ถ้าในนั้นไม่มี return
ให้ลองนึกถึง map, reduce
Credits
Terry, Bas, Viktor, Steven for joining my discussion. ;)