Tell, Don’t Ask เป็นแนวคิดที่ทำให้เราจำได้ว่า
Object นั้นต้องมีทั้งข้อมูล และ function การทำงาน
ซึ่งทำงานบนข้อมูลของ object นั้นๆ
แนวคิดนี้ช่วยย้ำเตือนเราว่า

แทนที่เราจะ “ถาม” ว่า object  ทำอะไรกับข้อมูลได้บ้าง ก่อนที่จะทำงาน
มาเป็น  “บอก” เลยว่า object นี้ทำอะไรกับข้อมูล

นั่นคือ การทำให้หน้าที่การทำงานไปพร้อมกับข้อมูลของ object เลย
หรือคือการซ่อนหน้าที่การทำงานภายในของ object นั่นเอง

อธิบายเท่านี้ ก็ยังงงๆ อยู่ มาดูตัวอย่างกันดีกว่า

ในโลกของ Object Oriented นั้น อธิบาย Tell, Don’t Ask ไว้ว่า

… you should endeavor to tell objects what you want them to do;
do not ask them questions about their state, make a decision, and then tell them what to do.

คุณควรที่จะพยายามบอก object ว่า ต้องการให้มันทำอะไร
ไม่ใช่ถามเกี่ยวกับสถานะของมัน ก่อนจะทำการจัดสินใจว่าจะทำอะไร

จากที่ Bliki ของคุณ Martin Fowler อธิบายด้วยรูปของการถาม (Ask)
ดังนี้

Screen Shot 2557-10-24 at 11.17.16 AM

ถ้าดู code แล้วจะพบ code ในรูปแบบนี้เยอะมาก

จาก code เราทำการดึงข้อมูลของ Widget
ต่อมาทำการตรวจสอบว่า parent ของ Widget ที่ได้มีค่าเป็น null หรือไม่
ถ้าไม่ให้ทำการดึงข้อมูล parent ออกมา และทำการ remove ออกไปจาก Widget ซะ

ซึ่งเป็นการเขียน code แบบการถามว่า parent ของ Widget มีค่าเป็น null หรือไม่ (Internal State)
ถ้าไม่ก็ถามอีกว่า parent มีค่าเป็นอะไร ก่อนที่จะทำการ remove ออกไป

มันคือการแหกกฎ Law Of Demeter นั่นเอง
แต่ก็ดีต่อการเริ่มต้น refactoring code ให้มันดีขึ้น
ด้วยการซ่อนการทำงานภายใน
และไม่ต้องทำการเรียกใช้ method ของ object จากภายนอกอีกด้วย
มันช่วยลดการผูกมักของ code
ส่งผลให้การดูแลรักษาง่ายขึ้นตามไปด้วย

ดังนั้น ถ้าเราต้องการแก้ไขให้เป็นแบบบอก หรือ Tell ในการ update ค่าล่ะ จะทำอย่างไร

รูปแบบการทำงานของการบอก หรือ Tell เป็นดังรูป

Screen Shot 2557-10-24 at 11.31.11 AM

นั่นคือ การรวม function การทำงานไปกับข้อมูลของ object เลย
ซึ่งสามารถ refactoring code ให้อยู่ในรูปแบบง่ายๆ
ด้วยการสร้าง method ใหม่ขึ้นมาใน object widget คือ removeFromParent()
เป็นการซ่อนการทำงานเอาไว้ภายใน object

เป็นการเคารพในแนวคิด OCP (Open/Closed Principle) เช่นกัน
แต่บางคนก็อาจจะบอกว่า มันขัดแย้งกับ SRP ( Single Responsibility Principle ) เช่นเดียวกัน

ดังนี้

จะสังเกตว่าการตรวจสอบค่า null จะหายไปแล้วนะ
ลองกลับไปดู code ที่เราเขียนกันว่า
มี code รูปแบบนี้ หรือ การ ถาม object มากขนาดไหน
แล้วยังจะทำมันอยู่อีกหรือ ?

ยังมีวิธีการอื่นๆ สำหรับการ implement ตามแนวคิด Tell, Don’t Ask เช่น Annonymous  class และ Callback เป็นต้น

โดยสรุปแล้ว

แนวคิดนี้เป็นแนวคิดหนึ่งในการออกแบบ Object-Oriented
เพื่อที่จะรวมข้อมูลและการทำงานเข้าไว้ด้วยกันใน object
ทำให้เราสามารถดูแลจัดการได้ง่าย
เพราะว่าข้อมูลและการทำงานมันอยู่ที่เดียวกัน
และการทำงานภายในของมันต้องอยู่ภายใน component หรือระบบเดียวกันด้วยนะ
มันจะยิ่งทำให้ระบบนั้นๆ ทำงานได้ด้วยตัวเอง
คุณคือคนพัฒนา จะได้เข้าใจง่ายขึ้นนั่นเอง