ต้องการ singletons ใน PHP ใคร
โปรดสังเกตว่าการคัดค้านเกือบทั้งหมดไปยังซิงเกิลนั้นมาจากจุดยืนทางเทคนิค แต่ก็มีข้อ จำกัด ในขอบเขตเช่นกัน โดยเฉพาะอย่างยิ่งสำหรับ PHP อันดับแรกฉันจะแสดงเหตุผลบางประการในการใช้ซิงเกิลแล้วฉันจะวิเคราะห์การคัดค้านการใช้ซิงเกิล ก่อนคนที่ต้องการพวกเขา:
- ผู้ที่กำลังเข้ารหัสเฟรมเวิร์ก / codebase ขนาดใหญ่ซึ่งจะใช้ในสภาพแวดล้อมที่แตกต่างกันจำนวนมากจะต้องทำงานกับเฟรมเวิร์ก / โค้ดเบสที่มีอยู่ก่อนหน้านี้ที่แตกต่างกันด้วยความจำเป็นในการใช้งานที่แตกต่างกัน / การจัดการ / ผู้นำหน่วยทำ
ดูรูปแบบซิงเกิลเป็นแบบรวมตัวเอง เมื่อเสร็จแล้วคลาสซิงเกิลจะเข้มงวดกับรหัสใด ๆ ที่คุณใส่ไว้ในนั้นและจะทำหน้าที่เหมือนกับวิธีที่คุณสร้างวิธีการและตัวแปร และมันก็เป็นวัตถุเดียวกันเสมอในคำขอที่กำหนด เนื่องจากมันไม่สามารถสร้างได้สองครั้งเพื่อเป็นวัตถุสองชนิดที่แตกต่างกันคุณจึงรู้ว่าวัตถุแบบซิงเกิลคืออะไร ณ จุดใดก็ตามที่ระบุในรหัส - แม้ว่าจะมีการแทรกซิงเกิลตันเข้ากับฐานรหัสสปาเก็ตตี้สองอัน ดังนั้นมันทำให้ง่ายขึ้นในแง่ของวัตถุประสงค์ในการพัฒนา - แม้ว่าจะมีคนจำนวนมากที่ทำงานในโครงการนั้นเมื่อคุณเห็นซิงเกิลตันถูกกำหนดค่าเริ่มต้นในจุดเดียวใน codebase ที่กำหนดคุณรู้ว่ามันคืออะไรมันทำอย่างไร ทำและสถานะที่เป็นอยู่หากเป็นคลาสดั้งเดิมคุณจะต้องติดตามว่าวัตถุนั้นถูกสร้างขึ้นครั้งแรกที่ไหน วิธีการใดที่ถูกเรียกใช้ในมันจนกว่าจะถึงจุดนั้นในโค้ดและสถานะเฉพาะของมัน แต่ให้ปล่อยซิงเกิลตันที่นั่นและถ้าคุณทำการดีบั๊กและวิธีการข้อมูลที่เหมาะสมและติดตามเข้าไปในซิงเกิลในขณะที่เขียนโค้ดคุณจะรู้ว่ามันคืออะไร ดังนั้นจึงทำให้ง่ายขึ้นสำหรับผู้ที่ต้องทำงานกับรหัสฐานที่แตกต่างกันกับความจำเป็นของการรวมรหัสที่ทำไว้ก่อนหน้านี้กับปรัชญาที่แตกต่างกันหรือทำโดยคนที่คุณไม่ได้ติดต่อด้วย (นั่นคือผู้ขายโครงการ บริษัท - อะไรก็ตามที่ไม่มีอีกแล้วไม่มีการสนับสนุนใด ๆ ) มันทำให้ง่ายขึ้นสำหรับผู้ที่ต้องทำงานกับฐานรหัสที่แตกต่างกันกับความจำเป็นของการรวมรหัสที่ทำไว้ก่อนหน้านี้กับปรัชญาที่แตกต่างกันหรือทำโดยคนที่คุณไม่ได้ติดต่อกับ (นั่นคือผู้ขายโครงการ บริษัท - อะไรก็ตามที่ไม่มีอีกแล้วไม่มีการสนับสนุนใด ๆ ) มันทำให้ง่ายขึ้นสำหรับผู้ที่ต้องทำงานกับฐานรหัสที่แตกต่างกันกับความจำเป็นของการรวมรหัสที่ทำไว้ก่อนหน้านี้กับปรัชญาที่แตกต่างกันหรือทำโดยคนที่คุณไม่ได้ติดต่อกับ (นั่นคือผู้ขายโครงการ บริษัท - อะไรก็ตามที่ไม่มีอีกแล้วไม่มีการสนับสนุนใด ๆ )
- ผู้ที่ต้องทำงานกับAPIบริการและเว็บไซต์ของบุคคลที่สาม
หากคุณมองใกล้กว่านี้จะไม่แตกต่างไปจากกรณีก่อนหน้านี้มากเกินไป - API ของบุคคลที่สามบริการเว็บไซต์ต่าง ๆ ก็เหมือนกับฐานรหัสภายนอกที่แยกต่างหากซึ่งคุณไม่สามารถควบคุมได้ สิ่งที่สามารถเกิดขึ้นได้ ดังนั้นด้วยเซสชันเดี่ยว / คลาสผู้ใช้คุณสามารถจัดการการใช้งานเซสชัน / การอนุญาตใด ๆ จากผู้ให้บริการบุคคลที่สามเช่นOpenID , Facebook , Twitterและอื่น ๆ อีกมากมาย - และคุณสามารถทำสิ่งเหล่านี้ทั้งหมดในเวลาเดียวกันจากวัตถุ Ston singleton - ซึ่งสามารถเข้าถึงได้ง่ายในสถานะที่รู้จัก ณ จุดใดก็ตามในโค้ดที่คุณเสียบเข้าไป คุณยังสามารถสร้างหลายเซสชันไปยัง API / บริการบุคคลที่สามที่แตกต่างกันหลายรายการสำหรับผู้ใช้ SAME ในเว็บไซต์ / แอปพลิเคชันของคุณเองและทำสิ่งที่คุณต้องการจะทำกับพวกเขา
แน่นอนว่าทั้งหมดนี้ยังสามารถปรับโทนเสียงด้วยวิธีการดั้งเดิมโดยใช้คลาสและวัตถุปกติ - การจับที่นี่คือซิงเกิลที่เป็น tidier, neater และดังนั้นเนื่องจากการจัดการ / ทดสอบได้ง่ายกว่าเมื่อเทียบกับการใช้คลาส / วัตถุแบบดั้งเดิมในสถานการณ์ดังกล่าว
- ผู้ที่ต้องทำการพัฒนาอย่างรวดเร็ว
พฤติกรรมที่เหมือนกันทั่วโลกของซิงเกิลทำให้ง่ายต่อการสร้างโค้ดประเภทใด ๆ ที่มีเฟรมเวิร์กซึ่งมีคอลเลกชันของ singletons ที่จะสร้างต่อไปเพราะเมื่อคุณสร้างคลาสซิงเกิลตันของคุณดีขึ้น ใช้งานได้ทุกที่ทุกเวลาในรูปแบบที่สอดคล้องกัน มันใช้เวลาพอสมควรที่จะทำให้ชั้นเรียนของคุณครบกำหนด แต่หลังจากนั้นพวกมันก็จะแข็งและสม่ำเสมอและมีประโยชน์ คุณสามารถมีวิธีการมากมายในการทำสิ่งเดียวที่คุณต้องการและแม้ว่ามันอาจเพิ่ม footprint หน่วยความจำของวัตถุ แต่ก็ช่วยประหยัดเวลาได้มากขึ้นสำหรับการพัฒนาอย่างรวดเร็วซึ่งเป็นวิธีที่คุณไม่ได้ใช้ในกรณีเดียว แอปพลิเคชันสามารถใช้ในแอพพลิเคชั่นอื่นที่รวมเข้าด้วยกันและคุณสามารถตบคุณลักษณะใหม่ที่ผู้จัดการลูกค้า / หัวหน้า / ผู้จัดการโครงการขอเพียงแค่ปรับเปลี่ยนเล็กน้อย
คุณได้รับความคิด ตอนนี้ให้ย้ายไปยังการคัดค้านเพื่อซิงเกิลตันและสงครามครูเสดที่ไม่บริสุทธิ์ต่อสิ่งที่มีประโยชน์ :
- การคัดค้านสำคัญที่สุดคือทำให้การทดสอบยากขึ้น
และจริง ๆ แล้วมันมีขอบเขตแม้ว่ามันสามารถบรรเทาได้ง่าย ๆ โดยการใช้มาตรการป้องกันที่เหมาะสมและการเข้ารหัสการดีบักรูทีนในซิงเกิลของคุณด้วยการตระหนักว่าคุณจะทำการดีบั๊กเดี่ยว แต่ดูว่ามันไม่ได้แตกต่างไปจากปรัชญา / วิธีการ / รูปแบบการเข้ารหัสอื่น ๆ ที่มีอยู่ - แค่นั้นซิงเกิลนั้นค่อนข้างใหม่และไม่แพร่หลายดังนั้นวิธีการทดสอบในปัจจุบันจึงไม่สอดคล้องกับพวกเขา แต่นั่นไม่ได้แตกต่างกันในทุกแง่มุมของภาษาการเขียนโปรแกรม - สไตล์ที่แตกต่างต้องใช้แนวทางที่แตกต่างกัน
เมื่อถึงจุดหนึ่งข้อคัดค้านนี้ก็คงที่โดยไม่สนใจข้อเท็จจริงที่ว่าเหตุผลที่ทำให้แอพพลิเคชั่นที่พัฒนาไม่ใช่สำหรับ 'การทดสอบ' และการทดสอบไม่ได้เป็นเพียงขั้นตอน / กระบวนการเดียวที่จะเข้าสู่การพัฒนาแอปพลิเคชัน แอพพลิเคชั่นได้รับการพัฒนาเพื่อใช้ในการผลิต และตามที่ฉันได้อธิบายไว้ในหัวข้อ 'ผู้ที่ต้องการซิงเกิลตัน' ซิงเกิลตันสามารถตัดข้อตกลงที่ยอดเยี่ยมจากความซับซ้อนในการทำให้โค้ดทำงานได้ด้วยและภายในโค้ดเบส / แอพพลิเคชั่น / บริการของบุคคลที่สามที่แตกต่างกัน เวลาที่อาจสูญหายในการทดสอบคือเวลาที่ได้รับในการพัฒนาและการปรับใช้ สิ่งนี้มีประโยชน์อย่างยิ่งในยุคนี้ของการรับรองความถูกต้องบุคคลที่สาม / แอปพลิเคชัน / การรวมระบบ - Facebook, Twitter, OpenID, อีกมากมายและผู้ที่รู้ว่ามีอะไรต่อไป
แม้ว่ามันจะเป็นที่เข้าใจได้ - โปรแกรมเมอร์ทำงานในสถานการณ์ที่แตกต่างกันมากขึ้นอยู่กับอาชีพของพวกเขา และสำหรับผู้ที่ทำงานใน บริษัท ที่ค่อนข้างใหญ่ซึ่งมีหน่วยงานที่กำหนดไว้จะดูแลซอฟต์แวร์ / แอพพลิเคชั่นที่แตกต่างกันในแบบสบาย ๆ และไม่มีการตัดงบประมาณ / การปลดพนักงานและสิ่งที่แนบมานั้นต้องทำสิ่งต่าง ๆ มากมาย แฟชั่นราคาถูก / รวดเร็ว / เชื่อถือได้ซิงเกิลอาจไม่จำเป็นเลย และมันอาจจะเป็นสิ่งที่สร้างความรำคาญ / เป็นอุปสรรคต่อสิ่งที่พวกเขามีอยู่
แต่สำหรับผู้ที่ต้องการทำงานในสนามเพลาะสกปรกของการพัฒนา 'เปรียว' ต้องดำเนินการตามคำขอที่แตกต่างกันหลายครั้ง (บางครั้งไม่มีเหตุผล) จากลูกค้า / ผู้จัดการ / โครงการของพวกเขาซิงเกิลตันเป็นพระคุณประหยัดเนื่องจากเหตุผลอธิบายไว้ก่อนหน้านี้
- ข้อขัดข้องอีกข้อหนึ่งก็คือรอยความทรงจำของมันนั้นสูงกว่า
เนื่องจากมีซิงเกิลตันใหม่สำหรับแต่ละคำขอจากลูกค้าแต่ละรายอาจเป็นข้อคัดค้านสำหรับ PHP ด้วยการสร้างและใช้ซิงเกิลตันที่ไม่ดีทำให้ footprint หน่วยความจำของแอปพลิเคชันสามารถสูงขึ้นได้หากผู้ใช้จำนวนมากได้รับบริการจากแอปพลิเคชัน ณ จุดใดก็ตาม
แม้ว่าวิธีนี้จะใช้ได้กับวิธีการใด ๆ ที่คุณสามารถทำได้ในขณะที่เขียนโค้ด คำถามที่ควรถามคือวิธีการข้อมูลที่จัดขึ้นและประมวลผลโดย singletons เหล่านี้ไม่จำเป็น? สำหรับหากพวกเขามีความจำเป็นในหลาย ๆ แอปพลิเคชันคำขอที่ได้รับแล้วแม้ว่าคุณจะไม่ได้ใช้ซิงเกิลตันวิธีการและข้อมูลเหล่านั้นจะปรากฏอยู่ในแอปพลิเคชันของคุณในบางรูปแบบหรืออย่างอื่นผ่านทางรหัส ดังนั้นทุกอย่างจะกลายเป็นคำถามว่าคุณจะประหยัดหน่วยความจำได้มากน้อยเพียงใดเมื่อคุณเริ่มต้นวัตถุคลาสแบบดั้งเดิม 1/3 ในการประมวลผลโค้ดและทำลายมัน 3/4 ลงไป
ดูเมื่อใส่ด้วยวิธีนี้คำถามจะไม่เกี่ยวข้องมาก - ไม่ควรมีวิธีที่ไม่จำเป็นข้อมูลที่จัดเก็บในวัตถุในรหัสของคุณทุกครั้ง - ไม่ว่าคุณจะใช้ singletons หรือไม่ก็ตาม ดังนั้นการคัดค้านเรื่องซิงเกิลจึงกลายเป็นเรื่องตลกอย่างมากในเรื่องนี้สันนิษฐานว่าจะมีวิธีการที่ไม่จำเป็นข้อมูลในวัตถุที่สร้างจากคลาสที่คุณใช้
- การคัดค้านที่ไม่ถูกต้องเช่น 'ทำให้การเชื่อมต่อหลายฐานข้อมูลเป็นไปไม่ได้ / ยากขึ้น'
ฉันไม่สามารถเข้าใจคำคัดค้านนี้ได้เมื่อทุกคนต้องการรักษาการเชื่อมต่อฐานข้อมูลหลายตัวเลือกฐานข้อมูลหลายแบบสอบถามฐานข้อมูลหลายชุดผลลัพธ์หลายชุดในซิงเกิลที่กำหนดเป็นเพียงเก็บไว้ในตัวแปร / อาร์เรย์ในซิงเกิลตราบเท่าที่ พวกเขาต้องการ สิ่งนี้สามารถทำได้ง่ายเพียงเก็บไว้ในอาร์เรย์แม้ว่าคุณจะสามารถคิดค้นวิธีการใดก็ได้ที่คุณต้องการใช้เพื่อให้เกิดผลนั้น แต่ลองตรวจสอบกรณีที่ง่ายที่สุดการใช้ตัวแปรและอาร์เรย์ในซิงเกิลที่กำหนด:
ลองนึกภาพด้านล่างนี้อยู่ในฐานข้อมูลเดี่ยวที่กำหนด:
$ this -> connections = array (); (ไวยากรณ์ผิดฉันเพิ่งพิมพ์มันเพื่อให้รูปภาพ - การประกาศที่เหมาะสมของตัวแปรคือ public $ connections = array () และการใช้มันคือ $ this-> connections ['connectionkey'] โดยธรรมชาติ)
คุณสามารถตั้งค่าและเก็บการเชื่อมต่อหลาย ๆ ครั้งตามเวลาที่กำหนดไว้ในอาร์เรย์ในลักษณะนี้ เช่นเดียวกันกับข้อความค้นหาชุดผลลัพธ์และอื่น ๆ
$ this -> แบบสอบถาม (QUERYSTRING, 'queryname', $ this-> การเชื่อมต่อ ['โดยเฉพาะ')
ซึ่งสามารถทำแบบสอบถามกับฐานข้อมูลที่เลือกด้วยการเชื่อมต่อที่เลือกและเก็บไว้ในของคุณ
$ this -> ผลลัพธ์
อาร์เรย์ที่มีคีย์ 'ชื่อแบบสอบถาม' แน่นอนว่าคุณจะต้องมีรหัสวิธีการสืบค้นสำหรับสิ่งนี้ - ซึ่งเป็นเรื่องเล็กน้อยที่จะทำ
สิ่งนี้ช่วยให้คุณสามารถรักษาจำนวนการเชื่อมต่อฐานข้อมูลและผลลัพธ์ให้ได้มากเท่าที่คุณต้องการ และพวกมันก็พร้อมใช้งานกับส่วนใดก็ได้ของรหัสในจุดใดก็ตามใน codebase ที่กำหนดซึ่งคลาสเดี่ยวนี้ได้รับการสร้างอินสแตนซ์
แน่นอนว่าคุณต้องปลดปล่อยชุดผลลัพธ์และการเชื่อมต่อเมื่อไม่ต้องการโดยธรรมชาติ แต่มันไม่ได้บอกอะไรเลยและมันก็ไม่ได้เฉพาะเจาะจงกับซิงเกิลตันหรือวิธีการเข้ารหัส / สไตล์ / แนวคิดอื่น ๆ
ณ จุดนี้คุณสามารถดูว่าคุณสามารถรักษาการเชื่อมต่อ / สถานะหลายรายการไปยังแอปพลิเคชันหรือบริการของบุคคลที่สามได้ในซิงเกิลเดียวกัน ไม่แตกต่างกัน
เรื่องสั้น ๆ สั้น ๆ ในท้ายที่สุดรูปแบบซิงเกิลเป็นอีกวิธี / รูปแบบ / ปรัชญาในการเขียนโปรแกรมและพวกมันก็มีประโยชน์เหมือนกันเมื่อใช้ในตำแหน่งที่ถูกต้องในแบบที่ถูกต้อง ซึ่งไม่แตกต่างจากสิ่งใด
คุณจะสังเกตเห็นว่าในบทความส่วนใหญ่ที่มีการทุบซิงเกิลคุณจะเห็นการอ้างอิงถึง 'globals' การเป็น 'ความชั่วร้าย'
ปล่อยให้หน้ามัน - สิ่งที่ไม่ได้ใช้อย่างถูกต้องถูกทารุณกรรมในทางที่ผิดคือความชั่วร้าย ที่ไม่ จำกัด ภาษาใด ๆ แนวคิดการเข้ารหัสใด ๆ วิธีการใด ๆ เมื่อใดก็ตามที่คุณเห็นคนที่ออกแถลงการณ์แบบครอบคลุมเช่น 'X is evil' ให้หนีจากบทความนั้น โอกาสสูงมากซึ่งเป็นผลมาจากมุมมองที่ จำกัด - แม้ว่ามุมมองนั้นเป็นผลมาจากประสบการณ์หลายปีโดยเฉพาะอย่างยิ่ง - ซึ่งโดยทั่วไปแล้วเป็นผลมาจากการทำงานมากเกินไปในรูปแบบ / วิธีการ - อนุรักษ์นิยมทางปัญญาทั่วไป
ตัวอย่างที่ไม่มีที่สิ้นสุดสามารถมอบให้ได้ตั้งแต่ 'กลมเป็นชั่ว' ถึง 'iframes เป็นชั่ว' ย้อนกลับไปเมื่อประมาณ 10 ปีที่แล้วแม้แต่การเสนอการใช้ iframe ในแอปพลิเคชันใดก็ตามก็ตามถือเป็นบาป จากนั้น Facebook, iframes มาทุกหนทุกแห่งและดูว่าเกิดอะไรขึ้น - iframes ก็ไม่ได้เลวร้ายอีกต่อไป
ยังมีคนที่ดื้อรั้นยืนยันว่าพวกเขาเป็น 'ความชั่วร้าย' - และบางครั้งก็มีเหตุผลที่ดีเช่นกัน - แต่อย่างที่คุณเห็นมีความจำเป็น iframes เติมเต็มความต้องการและทำงานได้ดีและดังนั้นโลกทั้งโลกจึงเดินหน้าต่อไป
ทรัพย์สินที่สำคัญที่สุดของวิศวกรโปรแกรมเมอร์ / coder / ซอฟต์แวร์คือจิตใจที่เปิดกว้างและยืดหยุ่น