[Algorithm] Telescoping Constructor Pattern

สวัสดีครับวันนี้ก็เปลี่ยนมาสอน java กันมังเนอะ หลังๆ นี่ผมเขียนแต่ android ก็พอดีได้อ่านหนังสือเล่นนึงชื่อ Effective Java ก็คราวก็เป็นหนังสือที่สอนเกี่ยวกับการเขียนโปรแกรมในภาษา java แบบไหนให้มีประสิทธิภาพหรือพูดง่ายๆ ว่าเขียนแบบไหนถึงจะเทพ ซึ่งผมอ่านแล้วก็ต้องบอกว่าประทับใจมากครับ ไม่ค่อยได้อ่านหนังสือในลักษณะนี้ที่สอนครบถ้วนและลึก ลองอ่านกันดูนะผมนำว่าหนังสือดีจริงๆ แต่ต้องแน่น oop หน่อยนะครับ มันเป็นหนังสือสำหรับที่ต้องการไปในขั้นแอนวานซ์ เอาละเข้าเรื่องก็คือผมจะมาสอนการทำ constructor  ให้เซตค่า property แบบหลายๆ ค่า ซึ่งก็แปลมาจากในหนังสือที่อ่านแหละครับ เขียนไว้กันลืม , การเซตค่าตัวแปรนั้นมันก็มีหลายวิธีอาจจะกำหนดลงตรงๆ หรือถ้าเป็น private ก็ทำด้วย acessor (setter method) ซึ่งก็ทำทีละตัวแต่ถ้าใช้วิธีนี้ก็สามารถกำหนดได้ทีละหลายๆ ตัวทำไงนั้นลองมาดูครับ

ก่อนอื่นผมก็เอามาตามในหนังสือเขากล่าวไว้ว่า “Consider the case of a class representing the Nutrition Facts label that appears on packaged foods” คือเขายกตัวอย่างข้อมูลทางโภชนการมา และเขาจะทำโปรแกรมสำหรับเว๖ข้อมลทางโภชนาการลองมาดุกันนะว่าทำยังไง

[sourcecode language=”java” wraplines=”false” collapse=”false”]<br />public class NutritionFacts {<br /> private final int servingSize; // (mL) required<br /> private final int servings; // (per container) required<br /> private final int calories; // optional<br /> private final int fat; // (g) optional<br /> private final int sodium; // (mg) optional<br /> private final int carbohydrate; // (g) optional<br /> public NutritionFacts(int servingSize, int servings) {<br /> this(servingSize, servings, 0);<br /> }<br /> public NutritionFacts(int servingSize, int servings, int calories) {<br /> this(servingSize, servings, calories, 0);<br /> }<br /> public NutritionFacts(int servingSize, int servings, int calories, int fat) {<br /> this(servingSize, servings, calories, fat, 0);<br /> }<br /> public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium) {<br /> this(servingSize, servings, calories, fat, sodium, 0);<br /> }<br /> public NutritionFacts(int servingSize, int servings,<br /> int calories, int fat, int sodium, int carbohydrate) {<br /> this.servingSize = servingSize;<br /> this.servings = servings;<br /> this.calories = calories;<br /> this.fat = fat;<br /> this.sodium = sodium;<br /> this.carbohydrate = carbohydrate;<br /> }<br />}<br />[/sourcecode]

อธิบายคราวๆ นะก็คือเขาตั่วแปร (properties) เพื่อมาใช้ในการเซตค่าโภชนาการ จากนั้นทำการสร้าง constructor , override method แล้วก็กำหนดค่าลงไปให้กับตัวแปรเราผ่าน this(); ที่เราจะมีการกำหนด 0 ในพารามิตเตอร์นั้นหมายความว่าให้ตัวอื่นๆ มีค่าเป็น 0 ครับ ที่นี่ก็จะเห็น method ตัวสุดท้ายคือทำการกำหนดค่าลงให้กับตัวแปรแต่ละตัวด้วยวิธีปกติ สำหรับวิธีการเรียกใช้ก็ตามนี้ครับ

[sourcecode language=”java” wraplines=”false” collapse=”false”]<br />NutritionFacts cocaCola = new NutritionFacts(240, 8, 100, 0, 35, 27);<br />// or<br />NutritionFacts example = new NutritionFacts(10, 8);<br />[/sourcecode]

จากโค้ดเราก็แค่สร้าง object ขึ้นมาแล้วก็กำหนดค่าลงไปผ่าน constructor ได้เลย ซึ่งยรรทัดแรกก็ทำการกำหนดค่าไปทั่งหมด และตัวต่อมากำหนดให้แค่servingSize, servings และตัวที่เหลือก็จะมีค่าเป็น 0 ตามที่อธิบายไป  มันก็ยังดีกว่าการมานั้งทำ get set ที่ละตัวใช่ไหมครับ? ดีแน่นอนแต่ว่ามันยังไม่ดีพอ เพราะคนอื่นจะไม่รู้ว่ากำหนดค่าลงให้ตัวแปลไหน ดังนั้นต่อไปผมจะมาสอน  Builder Pattern ตัวนี้จะต่อจากตัวบนแต่มีประสิทธิภาพกว่า

credit: Effective Java (2nd Edition) by Joshua Bloch  

Facebook Comments