ฉันเคยรักคลาสยูทิลิตี้ที่เต็มไปด้วยวิธีการคงที่ พวกเขารวมวิธีการช่วยเหลือที่ยอดเยี่ยมเข้าด้วยกันซึ่งอาจทำให้เกิดความซ้ำซ้อนและบำรุงรักษาได้ พวกมันใช้งานง่ายมากไม่มีอินสแตนซ์ไม่มีการกำจัดทิ้งเพียงแค่ไฟเท่านั้น ฉันเดาว่านี่เป็นความพยายามครั้งแรกของฉันในการสร้างสถาปัตยกรรมเชิงบริการ - บริการไร้สัญชาติจำนวนมากที่เพิ่งทำงานและไม่มีอะไรอื่น เมื่อระบบเติบโตขึ้นมังกรกำลังจะมา
ความแตกต่าง
สมมติว่าเรามีวิธี UtilityClass.SomeMethod ที่มีความสุขฉวัดเฉวียน ทันใดนั้นเราจำเป็นต้องเปลี่ยนฟังก์ชั่นเล็กน้อย ฟังก์ชั่นส่วนใหญ่เหมือนกัน แต่เราต้องเปลี่ยนสองส่วนอย่างไรก็ตาม หากไม่ใช่วิธีการคงที่เราสามารถสร้างคลาส derivate และเปลี่ยนเนื้อหาวิธีการได้ตามต้องการ เนื่องจากเป็นวิธีการคงที่เราจึงไม่สามารถทำได้ แน่นอนว่าถ้าเราต้องการเพิ่มฟังก์ชันการทำงานก่อนหรือหลังวิธีเก่าเราสามารถสร้างคลาสใหม่และเรียกคลาสเก่าที่อยู่ในนั้น - แต่นั่นก็แค่ขั้นต้น
อินเตอร์เฟส woes
ไม่สามารถกำหนดวิธีคงที่ผ่านส่วนต่อประสานได้ด้วยเหตุผลเชิงตรรกะ และเนื่องจากเราไม่สามารถแทนที่เมธอดแบบสแตติกคลาสแบบสแตติกจะไม่มีประโยชน์เมื่อเราต้องการส่งผ่านอินเทอร์เฟซของพวกเขา สิ่งนี้ทำให้เราไม่สามารถใช้คลาสคงที่เป็นส่วนหนึ่งของรูปแบบกลยุทธ์ เราอาจจะแก้ไขปัญหาบางอย่างขึ้นมาโดยผ่านผู้แทนแทนของอินเตอร์เฟซ
การทดสอบ
โดยพื้นฐานแล้วสิ่งนี้จะไปพร้อมกับอินเทอร์เฟซที่กล่าวถึงข้างต้น เนื่องจากความสามารถของเราในการแลกเปลี่ยนการใช้งานมี จำกัด มากเราจึงมีปัญหาในการเปลี่ยนรหัสการผลิตด้วยรหัสทดสอบ อีกครั้งเราสามารถปิดมันได้ แต่มันจะต้องให้เราเปลี่ยนส่วนใหญ่ของรหัสของเราเพียงเพื่อให้สามารถรับ wrappers แทนวัตถุจริง
Fosters blobs
เนื่องจากวิธีการแบบสแตติกมักจะใช้เป็นวิธีการอรรถประโยชน์และวิธีการใช้งานยูทิลิตี้มักจะมีวัตถุประสงค์ที่แตกต่างกันเราจะจบลงด้วยคลาสขนาดใหญ่ที่เต็มไปด้วยฟังก์ชั่นที่ไม่สอดคล้องกัน . ฉันอยากจะมีห้าครั้งในชั้นเรียนตราบเท่าที่จุดประสงค์ของพวกเขาชัดเจน
พารามิเตอร์คืบ
เริ่มต้นด้วยวิธีการคงที่ที่น่ารักและไร้เดียงสาเล็กน้อยอาจใช้พารามิเตอร์เดียว เมื่อมีการใช้งานเพิ่มขึ้นพารามิเตอร์ใหม่จะถูกเพิ่มเข้าไป อีกไม่นานจะมีการเพิ่มพารามิเตอร์เพิ่มเติมซึ่งเป็นทางเลือกดังนั้นเราจึงสร้างวิธีการโหลดมากเกินไป (หรือเพียงแค่เพิ่มค่าเริ่มต้นในภาษาที่รองรับพวกเขา) อีกไม่นานเรามีวิธีที่ใช้พารามิเตอร์ 10 ตัว ต้องการเฉพาะสามข้อแรกเท่านั้นพารามิเตอร์ 4-7 เป็นทางเลือก แต่ถ้ามีการระบุพารามิเตอร์ 6 จำเป็นต้องกรอก 7-9 ด้วยเช่นกัน ... หากเราสร้างคลาสด้วยจุดประสงค์เดียวในการทำสิ่งที่วิธีการคงนี้ทำเราสามารถแก้ปัญหานี้ได้โดยการใส่พารามิเตอร์ที่ต้องการใน ตัวสร้างและการอนุญาตให้ผู้ใช้ตั้งค่าทางเลือกผ่านคุณสมบัติหรือวิธีการตั้งค่าการพึ่งพาซึ่งกันและกันหลายรายการในเวลาเดียวกัน นอกจากนี้หากวิธีการใด ๆ มีความซับซ้อนเพิ่มขึ้น
เรียกร้องให้ผู้บริโภคสร้างตัวอย่างของคลาสโดยไม่มีเหตุผล
หนึ่งในข้อโต้แย้งที่พบบ่อยที่สุดคือทำไมความต้องการของผู้บริโภคในชั้นเรียนของเราจึงสร้างตัวอย่างสำหรับการเรียกใช้วิธีการเดียวในขณะที่ไม่มีประโยชน์สำหรับอินสแตนซ์ในภายหลัง การสร้างตัวอย่างของคลาสเป็นการดำเนินการที่ถูกมากในภาษาส่วนใหญ่ดังนั้นความเร็วจึงไม่ใช่ปัญหา การเพิ่มรหัสพิเศษให้กับผู้ใช้บริการนั้นเป็นค่าใช้จ่ายที่ต่ำในการวางรากฐานของโซลูชันที่สามารถบำรุงรักษาได้มากขึ้นในอนาคต และสุดท้ายถ้าคุณต้องการหลีกเลี่ยงการสร้างอินสแตนซ์เพียงแค่สร้าง wrapper เดี่ยวของคลาสที่อนุญาตให้นำมาใช้ใหม่ได้ง่าย - แม้ว่าสิ่งนี้จะทำให้ข้อกำหนดของคลาสของคุณนั้นไร้สัญชาติ หากไม่ใช่ไร้สัญชาติคุณยังสามารถสร้างวิธีการหุ้มห่อแบบคงที่ที่จัดการทุกอย่างในขณะที่ยังให้ประโยชน์ทั้งหมดในระยะยาว สุดท้าย
เฉพาะ Sith เท่านั้นที่เกี่ยวข้องกับสัมบูรณ์
แน่นอนว่ามีข้อยกเว้นที่ไม่ชอบวิธีการคงที่ของฉัน คลาสยูทิลิตี True ที่ไม่ก่อให้เกิดความเสี่ยงใด ๆ ต่อการขยายตัวเป็นกรณีที่ยอดเยี่ยมสำหรับวิธีการคงที่ - System.Convert เป็นตัวอย่าง หากโครงการของคุณเป็นแบบครั้งเดียวโดยไม่มีข้อกำหนดสำหรับการบำรุงรักษาในอนาคตสถาปัตยกรรมโดยรวมนั้นไม่สำคัญมาก - คงที่หรือไม่คงที่ไม่สำคัญเลย - ความเร็วในการพัฒนาจะเป็นอย่างไร
มาตรฐานมาตรฐานมาตรฐาน!
การใช้วิธีการแบบอินสแตนซ์ไม่ได้ขัดขวางคุณจากการใช้วิธีการแบบคงที่และในทางกลับกัน ตราบใดที่มีเหตุผลอยู่เบื้องหลังความแตกต่างและเป็นมาตรฐาน ไม่มีอะไรเลวร้ายไปกว่าการมองดูเลเยอร์ธุรกิจที่แผ่ขยายออกไปด้วยวิธีการใช้งานที่แตกต่าง