ข้ามไปยังเนื้อหา

Inline Variable

บางครั้งตัวแปร local ก็เป็นแค่ชื่อที่สองของ expression ที่คุณเข้าใจอยู่แล้ว ไม่ได้ทำให้อะไรชัดขึ้น ไม่ได้เอากลับมาใช้ซ้ำ มีแต่มาขวางระหว่างคุณกับ code ที่สำคัญ Inline Variable ตัดตัวกลางนั้นทิ้ง โดยแทนที่ตัวแปรด้วย expression แล้วลบบรรทัดประกาศออก เหลือชื่อให้ต้องตามน้อยลงหนึ่งชื่อ

คุณเจอตัวแปรที่ชื่อไม่ได้บอกอะไรมากไปกว่า expression ที่เก็บไว้ เช่น let basePrice = order.basePrice; แล้วใช้ basePrice แค่ครั้งเดียว นั่นคือเสียงรบกวนล้วน ๆ ผู้อ่านต้องเลื่อนขึ้นไปยืนยันว่า basePrice คือ order.basePrice จริง ๆ และไม่มีอะไรมากกว่านั้น ตัวแปรตัวนี้สัญญาว่าจะอธิบาย แต่ให้มาแค่คำพ้องความหมาย

นี่คือด้านตรงข้ามของ Extract Variable ตรงนั้นคุณเพิ่มชื่อเพราะ sub-expression อ่านไม่ออก ตรงนี้คุณตัดชื่อทิ้งเพราะไม่เคยคุ้มกับที่ที่กินไป เกณฑ์ตัดสินเหมือนกันทั้งสองทาง คือชื่อนั้นทำให้ code ชัดกว่า expression ดิบหรือเปล่า ถ้าไม่ ก็ inline ทิ้งไปเลย

โค้ดเช็คเงื่อนไขการจัดส่งตัวนี้ตั้งตัวแปรสองตัวที่เป็นแค่ภาพสะท้อนของ field แล้วใช้แต่ละตัวครั้งเดียว

// Before
function canShipFree(order: Order): boolean {
const basePrice = order.basePrice;
const overThreshold = basePrice > 100;
return overThreshold;
}
// After
function canShipFree(order: Order): boolean {
return order.basePrice > 100;
}
  1. เช็คว่า expression ที่กำหนดให้ตัวแปรไม่มี side effect — การ inline ต้องไม่เปลี่ยนว่า expression นั้นรัน เมื่อไร หรือ กี่ครั้ง
  2. ถ้าตัวแปรยังไม่ใช่ read-only ให้เปลี่ยนเป็น read-only ก่อน (const, final หรือ binding ที่กำหนดค่าได้ครั้งเดียว) ถ้า compiler บ่น แปลว่ามีการกำหนดค่าใหม่ ให้หยุดตรงนั้น เพราะตัวแปรทำมากกว่าสะท้อนค่าแล้ว
  3. หาจุดแรกที่อ่านตัวแปร แล้วแทนที่ด้วย expression
  4. รัน test
  5. ทำซ้ำกับจุดที่เหลือทีละจุด รัน test คั่นไปเรื่อย ๆ
  6. เมื่อไม่เหลือจุดที่อ่านแล้ว ให้ลบบรรทัดประกาศตัวแปรทิ้ง
  7. รัน test อีกรอบ

inline ตัวแปรเมื่อชื่อไม่ได้ให้ข้อมูลอะไรเกินกว่าที่ expression บอกอยู่แล้ว และใช้แค่หนึ่งหรือสองจุดที่อยู่ใกล้กัน ถอดออกแล้ว function สั้นลง และผู้อ่านไม่ต้องกระโดดไปมาอีกหนึ่งครั้ง

อย่า inline ถ้าชื่อตัวแปรอธิบายความหมายที่ไม่ชัดในตัว ถ้า expression ใช้ซ้ำหลายครั้ง (ชื่อช่วยเลี่ยงทั้งความซ้ำและการคำนวณซ้ำ) หรือถ้า expression แพงและตัวแปรทำหน้าที่ cache ผลไว้ กรณีแบบนั้นสิ่งที่คุณต้องการคือด้านตรงข้าม — Extract Variable

ใช้ Inline Variable เมื่อหลีกเลี่ยงเมื่อ
variable name ไม่ได้อธิบายดีกว่า expressionexpression ซับซ้อน — variable ช่วยให้อ่านง่าย
variable ใช้แค่ครั้งเดียว ทันทีหลัง assignต้องการ debug — variable ทำให้เห็นค่ากลาง
กำลัง refactor และ variable กลายเป็น noiseexpression มี side effect

⚠️ ไม่ควร Inline Variable เมื่อ:

  • expression นั้นใช้หลายจุด — inline แล้วจะ evaluate ซ้ำ
  • ชื่อ variable บอก business intent ที่ expression ไม่บอก
  • expression มี side effect ที่ต้องรันแค่ครั้งเดียว
ตัวแปรแบบไหนเหมาะจะ inline?
Inline Variable เป็นด้านตรงข้ามของ refactoring แบบใด?
ก่อน inline expression ต้องยืนยันอะไรก่อน?
ตอนไหนที่ไม่ควร inline ตัวแปร?