ไม่เคยพูดว่า "ไม่เคย"
ฉันไม่คิดว่ามันจะไม่ดี แต่ถ้าคุณทำมันไม่ดีและเป็นการละเมิด
เราทุกคนต้องการเครื่องมือและยูทิลิตี้
สำหรับผู้เริ่มต้นเราทุกคนใช้ห้องสมุดบางอย่างซึ่งบางครั้งก็ถือว่าเป็นที่แพร่หลายและต้องห้าม ตัวอย่างเช่นในโลก Java, Google GuavaหรือApache Commonsบางส่วน( Apache Commons Lang , Apache Commons Collections , ฯลฯ ... )
ดังนั้นจึงมีความจำเป็นอย่างชัดเจนสำหรับสิ่งเหล่านี้
หลีกเลี่ยง Hard-Word, การทำซ้ำและการแนะนำบั๊ก
หากคุณคิดว่าเกี่ยวกับเหล่านี้จะสวยมากเพียงพวงใหญ่มากของเหล่านี้Util
เรียนคุณอธิบายยกเว้นคนที่เดินผ่านช่วงที่ดีที่จะได้รับพวกเขา (ค่อนข้าง) ขวาและพวกเขาได้รับเวลา - ผ่านการทดสอบอย่างหนักและตา balled โดยคนอื่น
ดังนั้นฉันจะบอกว่ากฎข้อแรกของหัวแม่มือเมื่อรู้สึกว่าคันที่จะเขียนUtil
ชั้นเรียนคือการตรวจสอบว่าUtil
ชั้นเรียนไม่ได้มีอยู่จริง
ข้อโต้แย้งเดียวที่ฉันเคยเห็นคือเมื่อคุณต้องการ จำกัด การพึ่งพาของคุณเพราะ:
- คุณต้องการ จำกัด จำนวนหน่วยความจำของการอ้างอิงของคุณ
- หรือคุณต้องการควบคุมสิ่งที่นักพัฒนาซอฟต์แวร์อนุญาตให้ใช้อย่างแน่นหนา (เกิดขึ้นในทีมใหญ่ที่ย่ำแย่หรือเมื่อมีการกำหนดกรอบงานเฉพาะสำหรับการมีคลาสซุปเปอร์เส็งเคร็งแปลก ๆ เพื่อหลีกเลี่ยงที่อื่น)
แต่ทั้งสองแบบนี้สามารถ tackled โดยใหม่บรรจุภัณฑ์ lib โดยใช้ProGuardหรือเทียบเท่าหรือการทำให้มันแตกต่างด้วยตัวคุณเอง (สำหรับMavenผู้ใช้ที่Maven สีปลั๊กอินข้อเสนอบางรูปแบบการกรองเพื่อบูรณาการนี้เป็นส่วนหนึ่งของการสร้างของคุณ)
ดังนั้นถ้ามันอยู่ใน lib และตรงกับกรณีการใช้งานของคุณและไม่มีเกณฑ์มาตรฐานบอกให้คุณใช้มัน หากมันแตกต่างจากสิ่งที่คุณเล็กน้อยให้ขยาย (ถ้าเป็นไปได้) หรือขยายมันหรือในทางเลือกสุดท้ายเขียนใหม่
อนุสัญญาการตั้งชื่อ
อย่างไรก็ตามในคำตอบนี้ฉันโทรหาพวกเขาUtil
เหมือนคุณ อย่าตั้งชื่อพวกเขาว่า
ตั้งชื่อที่มีความหมาย นำ Google Guava มาเป็นตัวอย่างที่ดี (อย่างมาก) ว่าควรทำอย่างไรและเพียงจินตนาการว่าcom.google.guava
เนมสเปซนั้นเป็นutil
รากของคุณ
โทรหาแพ็คเกจของคุณutil
ที่แย่ที่สุด แต่ไม่ใช่ชั้นเรียน หากข้อตกลงกับString
วัตถุและการจัดการของสตริงสร้างเรียกมันว่าStrings
ไม่StringUtils
(ขอโทษApache Commons Lang - ฉันยังคงชอบและใช้คุณ!) ถ้ามันทำสิ่งที่เฉพาะเจาะจงเลือกชื่อคลาสที่เฉพาะเจาะจง (เช่นSplitter
หรือJoiner
)
หน่วยทดสอบ
หากคุณต้องหันไปเขียนโปรแกรมอรรถประโยชน์เหล่านี้ตรวจสอบให้แน่ใจว่าได้ทดสอบหน่วย ข้อดีของยูทิลิตี้คือพวกมันมักจะเป็นส่วนประกอบในตัวเองซึ่งรับอินพุตเฉพาะและส่งคืนเอาต์พุตเฉพาะ นั่นคือแนวคิด ดังนั้นจึงไม่มีข้อแก้ตัวใด ๆ ที่จะไม่ทำการทดสอบหน่วย
นอกจากนี้การทดสอบหน่วยจะช่วยให้คุณสามารถกำหนดและบันทึกสัญญาของ API ได้ หากการทดสอบทำลายทั้งคุณเปลี่ยนแปลงบางสิ่งบางอย่างทางที่ผิดหรือมันหมายความว่าคุณกำลังพยายามที่จะเปลี่ยนสัญญา API ของคุณ(หรือว่าการทดสอบเดิมของคุณเป็นอึ - เรียนรู้จากมันและไม่ทำมันอีกครั้ง)
การออกแบบ API
การตัดสินใจออกแบบของคุณจะใช้กับ API เหล่านี้จะติดตามคุณไปอีกนาน ดังนั้นในขณะที่ไม่ใช้เวลาเขียนข้อความSplitter
-clone ให้ระมัดระวังเกี่ยวกับวิธีการแก้ไขปัญหาของคุณ
ถามตัวเองคำถามสองสามข้อ:
- วิธีการยูทิลิตี้ของคุณรับประกันคลาสด้วยตัวเองหรือเป็นวิธีการแบบคงที่ดีพอถ้ามันเหมาะสมที่จะเป็นส่วนหนึ่งของกลุ่มของวิธีการที่มีประโยชน์ในทำนองเดียวกัน?
- คุณต้องการวิธีการจากโรงงานเพื่อสร้างวัตถุและทำให้ API ของคุณอ่านง่ายขึ้นหรือไม่?
- เมื่อพูดถึงความสามารถในการอ่านคุณต้องการFluent API , buildersและอื่น ๆ หรือไม่?
คุณต้องการให้สิ่งของเหล่านี้ครอบคลุมความกว้างของกรณีการใช้งานให้มีความแข็งแกร่งมั่นคงมีเอกสารที่ดีตามหลักการของความประหลาดใจน้อยที่สุดและอยู่ในตัวเอง ตามหลักแล้วแต่ละแพ็กเกจย่อยของแพ็กเกจของคุณหรือแพ็กเกจ util ทั้งหมดของคุณอย่างน้อยต้องส่งออกไปยังบันเดิลเพื่อให้ใช้งานซ้ำได้ง่าย
ตามปกติเรียนรู้จากยักษ์ใหญ่ที่นี่:
- ลอดผ่านเหล่านี้แล้ววิเคราะห์และเปรียบเทียบและกลับไปกับพวกเขามักจะทำมันอีกครั้ง(หมายเหตุว่าผมไม่ได้ทำให้การตัดสินใด ๆ เกี่ยวกับว่าเหล่านี้เป็นอย่างหรือบางส่วนดีหรือไม่ดีเน้นอยู่บนวิเคราะห์และเปรียบเทียบบิต) :
- ดูวิธีการออกแบบ API ที่ดีของ Josh Bloch และทำไมจึงเป็นเรื่องสำคัญ ( สไลด์ )
- อ่านและดูเนื้อหาเพิ่มเติมจาก Bloch:
- อ่านเรื่อง API การออกแบบ
ใช่สิ่งเหล่านี้จำนวนมากให้ความสำคัญกับคอลเลกชันและโครงสร้างข้อมูล แต่อย่าบอกฉันว่าไม่ว่าที่ไหนหรืออะไรที่คุณมักจะใช้ประโยชน์ส่วนใหญ่ของคุณไม่ว่าทางตรงหรือทางอ้อม
Util
ในชื่อคลาสของคุณ แก้ไขปัญหา.