Voice in the Gentle Wind

กรกฎาคม 26, 2007

กูเกิลโอเพนซอร์ส Google Singleton Detector

Filed under: java — deans4j @ 5:02 pm

กูเกิลโอเพนซอร์สเครื่องมือตัวใหม่เพื่อช่วยให้นักพัฒนาค้นหา Singleton Pattern ภายในโค้ดจาวา เพื่อเป็นเครื่องมือช่วยให้นักพัฒนารู้ตัวว่ากำลังทำงานอยู่กับ Singleton

Singleton เป็นหนึ่งใน design pattern ของ Gang of 4 ที่ถูกใช้กันอย่างผิดๆ และมากจนเกินเลย ข้อผิดพลาดส่วนใหญ่มาจากผู้ที่ไม่เข้าใจแนวคิด OOP อย่างดีพอ

Singleton จัดเป็น pattern ที่สร้างง่าย แต่มีอันตรายมาก ผู้ที่คุ้นเคยภาษาดั้งเดิมที่มีคอนเซปต์ตัวแปร global มักจะหลงรัก pattern นี้ได้ง่ายและใช้มันอย่างผิดวิสัยที่ GOF ตั้งใจ

หลายๆ ทีที่ Singleton มีผลร้ายมากกว่าผลเสีย และมักพบปัญหาตามมาที่หลัง เช่น

  • ทำให้ในแต่ละหน่วยเสีย modularity ลง
  • การ test โปรแกรมเกิดข้อผิดพลาดเนื่องจากไม่รู้ว่าภายในมีการเรียกใช้ Singleton ส่งผลให้แต่ละ unit test เกิดการขึ้นต่อกันอย่างไม่ได้ตั้งใจ (ซึ่งมันผิดหลักของ unit testing)
  • ผู้ใช้ไม่สามารถหลีกเลี่ยงการ unit test โดยไม่ test Singleton ไปด้วย
  • ใน Test Driven Development มองว่า Singleton เป็นสิ่งชั่วร้ายเลยด้วยซ้ำ
  • ปัญหาการ subclass คลาส Singleton ที่จะไม่ใช่ Singleton อีกต่อไปสร้างปัญหาอย่างมาก เนื่องจากผิดเจตนารมณ์ของผู้สร้าง และเป็นกับดักที่ซ่อนตัวอย่างแนบเนียนซะด้วย
  • Singleton สร้างปัญหาให้สถาปัตยกรรมยุ่งยากขึ้น เมื่อผู้ออกแบบเบื้องต้นไม่ได้คำนึงถึงจะมีการเรียกใช้ผ่านการทำ concurrent programming

ปัจจุบันโปรแกรมเมอร์ที่ดีมักจะผลักภาระนี้ไปให้ IoC Container ทั้งหลายเป็นผู้บริหารการแจกจ่าย Singleton object ให้กับผู้ที่ต้องการจริงๆ แทนที่จะ hard code ลงไปในสถาปัตยกรรม

ในโปรแกรมของคุณมี Singleton กันกี่ที่เอ่ย?

ที่มา – Google Code Blog

Advertisements

6 ความเห็น »

  1. อย่างการใช้ BeanFactory ไป lookup spring beans ใน spring configuration file

    มันมีผลเสียยังไงบ้างเหรอครับ ?

    เพราะ BeanFactory ก็เป็น Singleton

    แล้ว ServiceLocator เป็น Singleton มั้ย

    งง ครับ

    ความเห็น โดย idome — กรกฎาคม 26, 2007 @ 9:29 pm

  2. เคยขียนด้วย c# ว่ะ เจอ multi thread ไปม่องเลย T_T
    ยังดี ยังแก้ได้ 😛

    ความเห็น โดย plynoi — กรกฎาคม 27, 2007 @ 12:02 am

  3. ปกติผมชอบใช้ Singleton สำหรับการสร้าง Connection อ่ะ ทำครั้งเดียว ทุกโมดูลที่ต้องเชื่อมกับ DB ก็ใช้ตัวนี้ครั้งเดียวสะดวกดี และกิน resource น้อยด้วยซิครับ

    โทษด้วยนะครับ ยังเป็น a java baby อยู่ ทุกวันนี้ยุ่งแต่กับข้อมูล

    ความเห็น โดย GMz — กรกฎาคม 27, 2007 @ 12:11 am

  4. ประเด็นของดีน คือ อย่าไปทำเป็น explicit singleton มากกว่า(มั้ง)ครับ
    เพราะมันจะทำให้ code ทำงานได้แค่แบบ singleton เท่านั้น (ถ้าให้ IoC จัดการให้ วันข้างหน้า จะเปลี่ยนให้มันสร้างหลายๆ instance ก็ยังได้)

    ความเห็น โดย siroz — กรกฎาคม 27, 2007 @ 11:19 am

  5. ใช่แล้วครับ การ explicit ประกาศเป็น Singleton หมด ค่อนข้างน่ากลัวทีเดียว

    Singleton ใช้ได้นะครับ ถ้ารู้ตัวว่่าทำอะไรอยู่แล้วสภาพความเป็น Singleton เป็นไปในทาง physical มากกว่า logical

    เห็นรุ่นน้องประกาศ Service Layer ทั้งหลายเป็น Singleton แล้วปวดใจครับ มันมากเกินไป โปรแกรมไม่มีปัญหา แค่ไม่อยาก new กันเท่านั้นเอง

    พอถึงตอน test ไม่รู้จะ test กันยังไงโดยข้าม Singleton นั้นไป กลับกันถ้าใช้ IoC ฉีดเข้ามาแทนง่ายกว่าเยอะ

    @plynoi – ถ้าเจอพวกระบบที่ต้องทำ clustering แล้ว Singleton ที่ไม่ได้วางแผนไว้จะไ่ม่ใช่ Singleton จริงๆ กลายเป็นแต่ละ cluster มี Singleton ของตัวเอง ถ้าไม่ผิด requirement ทำงานได้ถูกต้องอยู่ก็ดีไป แต่ถ้าไม่ละ?

    ความเห็น โดย deans4j — กรกฎาคม 27, 2007 @ 3:26 pm

  6. @dean – ตอนนั้นทำ log ว่ะ ไม่ได้ทำ cluster 😛 หรือเขียนด้วย java แล้วมันจะหายวะ 😛

    ความเห็น โดย plynoi — กรกฎาคม 28, 2007 @ 10:45 am


RSS feed for comments on this post. TrackBack URI

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

บลอกที่ WordPress.com .

%d bloggers like this: