ชั้นเรียนยูทิลิตี้เป็นสิ่งชั่วร้าย? [ปิด]


97

เห็นกระทู้นี้แล้ว

หากคลาส "ยูทิลิตี้" ชั่วร้ายฉันจะใส่รหัสทั่วไปของฉันได้ที่ไหน

และคิดว่าทำไมคลาสยูทิลิตี้ถึงชั่วร้าย?

สมมติว่าฉันมีโมเดลโดเมนที่ลึกหลายสิบชั้น ฉันต้องการอินสแตนซ์ xml-ify ได้ ฉันสร้างเมธอด toXml บนพาเรนต์หรือไม่ ฉันสร้างคลาสตัวช่วย MyDomainXmlUtility.toXml หรือไม่ นี่เป็นกรณีที่ธุรกิจต้องการครอบคลุมทั้งรูปแบบโดเมนจริง ๆ แล้วเป็นวิธีการอินสแตนซ์หรือไม่ จะเกิดอะไรขึ้นถ้ามีวิธีการเสริมมากมายในฟังก์ชัน xml ของแอปพลิเคชัน?


27
การลดค่าของคำว่า "ชั่ว" คือความชั่วร้าย!
Matthew Lock

1
@matthew ฉันรักษาเงื่อนไขของโพสต์ที่คำถามของฉันตั้งอยู่ ... ;)
hvgotcodes

คลาสยูทิลิตี้เป็นความคิดที่ไม่ดีด้วยเหตุผลเดียวกันคือ
CurtainDog

1
การถกเถียงกันว่าจะมีเมธอด toXML หรือไม่เป็นวิธีที่มีศูนย์กลางอยู่ที่แบบจำลองโดเมนที่หลากหลายกับ anemic codeflow.blogspot.com/2007/05/anemic-vs-rich-domain-models.html
James P.

@james, toXML เป็นเพียงตัวอย่าง ... แล้วฟังก์ชัน regex ที่ใช้ทั่วทุกที่ล่ะ? เช่นเดียวกับคุณต้องทำบางอย่างกับสตริงในโมเดลโดเมนของคุณ แต่คุณไม่สามารถใช้คลาสย่อยได้เนื่องจากมีข้อกังวลเกี่ยวกับการลบล้างอื่นที่ใช้ซูเปอร์คลาสหนึ่งของคุณ (ใน java)
hvgotcodes

คำตอบ:


129

คลาสยูทิลิตี้ไม่ได้ชั่วร้ายอย่างแน่นอน แต่สามารถละเมิดหลักการที่ประกอบขึ้นด้วยการออกแบบเชิงวัตถุที่ดี ในการออกแบบเชิงวัตถุที่ดีคลาสส่วนใหญ่ควรเป็นตัวแทนของสิ่งเดียวและคุณลักษณะและการดำเนินการทั้งหมด หากคุณกำลังดำเนินการกับสิ่งหนึ่งวิธีการนั้นน่าจะเป็นสมาชิกของสิ่งนั้น

อย่างไรก็ตามมีหลายครั้งที่คุณสามารถใช้คลาสยูทิลิตี้เพื่อจัดกลุ่มวิธีการต่างๆเข้าด้วยกันตัวอย่างเช่นjava.util.Collectionsคลาสที่มียูทิลิตี้จำนวนหนึ่งที่สามารถใช้ได้กับคอลเลกชัน Java ใด ๆ สิ่งเหล่านี้ไม่ได้เจาะจงไปที่คอลเล็กชันประเภทใดประเภทหนึ่ง แต่ใช้อัลกอริทึมที่สามารถใช้กับคอลเล็กชันใดก็ได้

จริงๆแล้วสิ่งที่คุณต้องทำคือคิดเกี่ยวกับการออกแบบของคุณและกำหนดตำแหน่งที่เหมาะสมที่สุดในการวางวิธีการ โดยปกติแล้วจะเป็นการดำเนินการภายในชั้นเรียน อย่างไรก็ตามบางครั้งมันก็เป็นคลาสยูทิลิตี้ อย่างไรก็ตามเมื่อคุณใช้คลาสยูทิลิตี้อย่าเพิ่งโยนเมธอดแบบสุ่มเข้าไปแทนที่จะจัดระเบียบวิธีการตามวัตถุประสงค์และฟังก์ชันการทำงาน


เข้ากันได้ดีกับบทความนี้เกี่ยวกับการตรวจสอบยูทิลิตี้ / คลาสตัวช่วยกับหลักการ SOLID oo เช่นกันreadability.com/articles/rk1vvcqy
melaos

8
หากภาษานั้นไม่มีกลไกเนมสเปซใด ๆ นอกเหนือจากคลาสคุณก็ไม่มีทางเลือกอื่นนอกจากใช้คลาสที่เนมสเปซทำผิด ใน C ++ คุณสามารถใส่ฟังก์ชันอิสระที่ไม่เกี่ยวข้องกับฟังก์ชันอื่น ๆ ลงในเนมสเปซได้ ใน Java คุณต้องใส่ลงในคลาสเป็นสมาชิกแบบคงที่ (คลาส)
Unslander Monica

1
การจัดกลุ่มเป็นวิธีการอาจผิดพลาดจากมุมมอง OOP อย่างไรก็ตาม OOP ไม่ค่อยเป็นวิธีแก้ปัญหา (ในข้อยกเว้นคือสถาปัตยกรรมระดับสูงและชุดเครื่องมือวิดเจ็ตซึ่งเป็นหนึ่งในอินสแตนซ์ที่ความหมายของการใช้โค้ดซ้ำโดยการสืบทอดนั้นเหมาะสมอย่างไม่น่าเชื่อ) และโดยทั่วไปเมธอดจะเพิ่มการมีเพศสัมพันธ์และการอ้างอิง ตัวอย่างเล็กน้อย: หากคุณระบุวิธีเครื่องพิมพ์ / สแกนเนอร์ให้กับคลาสของคุณเป็นวิธีการคุณเชื่อมต่อคลาสกับไลบรารีเครื่องพิมพ์ / สแกนเนอร์ นอกจากนี้คุณแก้ไขจำนวนการใช้งานที่เป็นไปได้ให้มีประสิทธิภาพ เว้นแต่คุณจะเข้ามาในอินเทอร์เฟซและเพิ่มการอ้างอิงเพิ่มเติม
Jo So

ในทางกลับกันฉันเห็นด้วยกับความเชื่อมั่นของคุณ "จัดกลุ่มตามวัตถุประสงค์และฟังก์ชันการทำงาน" มาดูตัวอย่างเครื่องพิมพ์ / สแกนเนอร์อีกครั้งและเริ่มต้นด้วยชุดคลาสการทำงานร่วมกันซึ่งออกแบบมาเพื่อวัตถุประสงค์ทั่วไป คุณอาจต้องการเขียนโค้ดดีบักและออกแบบการแสดงข้อความสำหรับชั้นเรียนของคุณ คุณสามารถติดตั้งเครื่องพิมพ์แก้จุดบกพร่องของคุณในไฟล์เดียวซึ่งขึ้นอยู่กับคลาสเหล่านั้นและไลบรารีเครื่องพิมพ์ทั้งหมด โค้ดที่ไม่ดีบักจะไม่ต้องรับภาระกับการอ้างอิงของการนำไปใช้งานนี้
Jo So

1
คลาส Util และ Helper เป็นสิ่งประดิษฐ์ที่โชคร้ายจากข้อ จำกัด ดังกล่าวและผู้ที่ไม่เข้าใจ OOP หรือไม่เข้าใจโดเมนของปัญหาก็ยังคงเขียนโค้ดขั้นตอนต่อไป
bilelovitch

57

ผมคิดว่าฉันทามติทั่วไปคืออาคารเรียนไม่ได้ชั่วร้ายต่อ se คุณต้องใช้มันอย่างรอบคอบ:

  • ออกแบบวิธียูทิลิตี้แบบคงที่ให้ใช้งานได้ทั่วไปและใช้ซ้ำได้ ตรวจสอบให้แน่ใจว่าพวกเขาไร้สัญชาติ กล่าวคือไม่มีตัวแปรคงที่

  • หากคุณมีวิธีการยูทิลิตี้มากมายให้แบ่งพาร์ติชั่นเป็นคลาสเพื่อให้นักพัฒนาค้นหาได้ง่าย

  • อย่าใช้คลาสยูทิลิตี้ซึ่งเมธอดแบบสแตติกหรืออินสแตนซ์ในคลาสโดเมนจะเป็นทางออกที่ดีกว่า ตัวอย่างเช่นพิจารณาว่าเมธอดในคลาสพื้นฐานนามธรรมหรือคลาสตัวช่วยแบบทันทีจะเป็นทางออกที่ดีกว่าหรือไม่

  • สำหรับ Java 8 เป็นต้นไป "วิธีการเริ่มต้น" ในอินเทอร์เฟซอาจเป็นตัวเลือกที่ดีกว่าคลาสยูทิลิตี้ (ดูอินเทอร์เฟซด้วยวิธีการเริ่มต้นเทียบกับคลาสนามธรรมใน Java 8เป็นต้น)


อีกวิธีหนึ่งในการดูคำถามนี้คือสังเกตว่าในคำถามที่ยกมา"ถ้าคลาสยูทิลิตี้" ชั่วร้าย ""เป็นข้อโต้แย้งของฟางแมน เหมือนฉันถาม:

"ถ้าหมูบินได้ควรพกร่มไหม".

ในคำถามข้างต้นฉันไม่ได้บอกว่าหมูบินได้ ... หรือว่าฉันเห็นด้วยกับโจทย์ที่ว่าพวกมันบินได้

ข้อความ"xyz is evil"โดยทั่วไปเป็นอุปกรณ์เกี่ยวกับวาทศิลป์ที่มีจุดมุ่งหมายเพื่อทำให้คุณคิดโดยใช้มุมมองที่รุนแรง พวกเขามักไม่ค่อย (ถ้าเคย) ตั้งใจให้เป็นข้อความที่แสดงถึงข้อเท็จจริงตามตัวอักษร


16

ชั้นเรียนยูทิลิตี้มีปัญหาเนื่องจากไม่สามารถจัดกลุ่มความรับผิดชอบกับข้อมูลที่สนับสนุนได้

อย่างไรก็ตามพวกมันมีประโยชน์อย่างยิ่งและฉันสร้างมันตลอดเวลาเป็นโครงสร้างถาวรหรือเป็นสเต็ปสโตนในระหว่างการปรับโครงสร้างใหม่ให้ละเอียดยิ่งขึ้น

จากคลาสยูทิลิตี้มุมมองClean Codeละเมิดความรับผิดชอบเดียวและหลักการเปิด - ปิด พวกเขามีเหตุผลมากมายในการเปลี่ยนแปลงและเนื่องจากการออกแบบไม่สามารถขยายได้ จริงๆแล้วควรมีอยู่ในระหว่างการปรับโครงสร้างใหม่เป็นแกนกลางเท่านั้น


2
ฉันจะเรียกมันว่าปัญหาในทางปฏิบัติเนื่องจากเช่นใน Java คุณไม่สามารถสร้างฟังก์ชันใด ๆ ที่ไม่ใช่เมธอดในคลาสได้ ในภาษาดังกล่าว "คลาสที่ไม่มีตัวแปรและด้วยวิธีการคงที่เท่านั้น" เป็นสำนวนที่ย่อมาจากเนมสเปซของฟังก์ชันยูทิลิตี้ ... เมื่อต้องเผชิญกับคลาสดังกล่าวใน Java การพูดถึงคลาสนั้นไม่ถูกต้องและไม่มีจุดหมาย IMHO แม้ว่าจะใช้classคำหลัก มันหลอกลวงเหมือนเนมสเปซมันเดินเหมือนเนมสเปซ - มันคือหนึ่ง ...
Unslander Monica

2
ฉันขอโทษที่พูดโผงผาง แต่ "วิธีการคงที่ไร้สัญชาติ [... ] oddballs ในระบบ OOP [... ] ปัญหาทางปรัชญา" นั้นเข้าใจผิดอย่างยิ่ง จะดีมากถ้าคุณสามารถหลีกเลี่ยงสถานะได้เพราะจะทำให้ง่ายต่อการเขียนโค้ดที่ถูกต้อง มันแตกเมื่อฉันต้องเขียนx.equals(y)เพราะ 1) ความจริงที่ว่าสิ่งนี้ไม่ควรแก้ไขสถานะใด ๆ ที่ไม่ได้รับการถ่ายทอด (และฉันไม่สามารถพึ่งพามันได้โดยไม่รู้ว่าการนำไปใช้งาน) 2) ฉันไม่เคยตั้งใจที่จะใส่x" เป็นที่ชื่นชอบ "หรือ" กระทำตาม "ตำแหน่งเมื่อเทียบกับy3) ฉันไม่ต้องการพิจารณา" อัตลักษณ์ "ของxหรือyเพียง แต่สนใจในคุณค่าของพวกเขา
Jo So

4
ฟังก์ชันการทำงานส่วนใหญ่ในโลกแห่งความเป็นจริงนั้นแสดงได้ดีที่สุดว่าเป็นฟังก์ชันทางคณิตศาสตร์แบบคงที่ไม่มีสถานะ Math.PI เป็นวัตถุที่ควรกลายพันธุ์หรือไม่? ฉันต้องสร้างอินสแตนซ์ AbstractSineCalculator ซึ่งใช้ IAbstractRealOperation เพียงเพื่อรับไซน์ของตัวเลขหรือไม่?
Jo So

1
@ JoSo ฉันเห็นด้วยอย่างยิ่งกับคุณค่าของการไร้สัญชาติและการคำนวณโดยตรง Naive OO ตรงข้ามกับสิ่งนี้ในทางปรัชญาและฉันคิดว่านั่นทำให้มันมีข้อบกพร่องอย่างมาก มันกระตุ้นให้เกิดความเป็นนามธรรมของสิ่งที่ไม่จำเป็นต้องใช้ (ตามที่คุณได้แสดงให้เห็น) และไม่สามารถให้นามธรรมที่มีความหมายสำหรับการคำนวณจริง อย่างไรก็ตามแนวทางที่สมดุลในการใช้ภาษา OO มีแนวโน้มที่จะไปสู่ความไม่เปลี่ยนรูปและการไร้สัญชาติเนื่องจากส่งเสริมความเป็นโมดูลและความสามารถในการบำรุงรักษา
Alain O'Dea

2
@ AlainO'Dea: ฉันตระหนักดีว่าฉันอ่านความคิดเห็นของคุณผิดเนื่องจากเป็นการต่อต้านการทำงานที่ไร้สัญชาติ ฉันขอโทษสำหรับน้ำเสียงของฉัน - ตอนนี้ฉันมีส่วนร่วมในโปรเจ็กต์ Java แรกของฉัน (หลังจากที่ฉันหลีกเลี่ยง OOP เป็นส่วนใหญ่ของการเขียนโปรแกรม 10 ปีของฉัน) และถูกฝังอยู่ภายใต้เลเยอร์ของสิ่งนามธรรมที่มีสถานะและความหมายที่ไม่ชัดเจน และฉันแค่ต้องการอากาศบริสุทธิ์ :-)
Jo So

9

ฉันคิดว่ามันเริ่มกลายเป็นความชั่วร้ายเมื่อ

1) มีขนาดใหญ่เกินไป (เพียงจัดกลุ่มให้เป็นหมวดหมู่ที่มีความหมายในกรณีนี้)
2) มีวิธีการที่ไม่ควรเป็นวิธีการคงที่

แต่ตราบใดที่ไม่ตรงตามเงื่อนไขเหล่านี้ฉันคิดว่ามันมีประโยชน์มาก


"วิธีการที่ไม่ควรเป็นวิธีการคงที่มีอยู่" เป็นไปได้อย่างไร?
Koray Tugay

@KorayTugay พิจารณาไม่คงที่เมื่อเทียบกับไฟฟ้าสถิตWidget.compareTo(Widget widget) WidgetUtils.compare(Widget widgetOne, Widget widgetTwo)การเปรียบเทียบเป็นตัวอย่างของสิ่งที่ไม่ควรทำแบบคงที่
ndm13

5

หลักการง่ายๆ

คุณสามารถมองปัญหานี้ได้จากสองมุมมอง:

  • *Utilวิธีการโดยรวมมักเป็นข้อเสนอแนะของการออกแบบโค้ดที่ไม่ดีหรือหลักการตั้งชื่อที่ขี้เกียจ
  • เป็นโซลูชันการออกแบบที่ถูกต้องสำหรับฟังก์ชันการทำงานแบบไร้สัญชาติข้ามโดเมนที่สามารถนำกลับมาใช้ใหม่ได้ โปรดทราบว่าสำหรับปัญหาทั่วไปเกือบทั้งหมดมีวิธีแก้ไขอยู่แล้ว

ตัวอย่าง 1. แก้ไขการใช้utilคลาส / โมดูล ตัวอย่างไลบรารีภายนอก

สมมติว่าคุณกำลังเขียนใบสมัครที่จัดการสินเชื่อและบัตรเครดิต ข้อมูลจากโมดูลเหล่านี้เปิดเผยผ่านบริการเว็บในjsonรูปแบบ ในทางทฤษฎีคุณสามารถแปลงวัตถุเป็นสตริงด้วยตนเองซึ่งจะอยู่ในjsonแต่นั่นจะเป็นการสร้างวงล้อใหม่ วิธีแก้ไขที่ถูกต้องจะรวมไว้ในไลบรารีภายนอกของโมดูลทั้งสองที่ใช้ในการแปลงวัตถุ java เป็นรูปแบบที่ต้องการ (ในภาพตัวอย่างที่ฉันแสดงgson )

ป้อนคำอธิบายภาพที่นี่


ตัวอย่างที่ 2. การใช้utilคลาส / โมดูลอย่างถูกต้อง เขียนของคุณเองutilโดยไม่มีข้อแก้ตัวให้กับสมาชิกในทีมคนอื่น ๆ

ในกรณีการใช้งานสมมติว่าเราจำเป็นต้องทำการคำนวณบางอย่างในสองโมดูลของแอปพลิเคชัน แต่ทั้งสองอย่างจำเป็นต้องทราบเมื่อมีวันหยุดราชการในโปแลนด์ ในทางทฤษฎีคุณสามารถทำการคำนวณเหล่านี้ภายในโมดูลได้ แต่จะเป็นการดีกว่าหากแยกฟังก์ชันนี้เพื่อแยกโมดูล

นี่คือรายละเอียดเล็ก ๆ แต่สำคัญ ชั้น / โมดูลที่คุณได้เขียนไม่ได้เรียกว่าแต่HolidayUtil PolishHolidayCalculatorมันเป็นutilคลาส แต่เราสามารถหลีกเลี่ยงคำทั่วไปได้

ป้อนคำอธิบายภาพที่นี่


1
ฉันเห็นแฟนตัวยง;)
Sridhar Sarnobat

3

ชั้นเรียนยูทิลิตี้ไม่ดีเพราะหมายความว่าคุณขี้เกียจเกินไปที่จะคิดชื่อชั้นเรียนให้ดีขึ้น :)

ที่ถูกกล่าวว่าฉันขี้เกียจ บางครั้งคุณแค่ต้องทำงานให้เสร็จและจิตใจของคุณก็ว่างเปล่า .. นั่นคือตอนที่คลาส "ยูทิลิตี้" เริ่มคืบคลานเข้ามา


3

เมื่อมองย้อนกลับไปที่คำถามนี้ตอนนี้ฉันจะบอกว่าวิธีการขยาย C # ทำลายความต้องการคลาสยูทิลิตี้โดยสิ้นเชิง แต่ไม่ใช่ทุกภาษาที่มีโครงสร้างอัจฉริยะเช่นนี้

คุณยังมี JavaScript ซึ่งคุณสามารถเพิ่มฟังก์ชันใหม่ลงในวัตถุที่มีอยู่ได้

แต่ฉันไม่แน่ใจว่ามีวิธีที่ดีในการแก้ปัญหานี้ในภาษาเก่าเช่น C ++ จริงๆ ...

รหัส OO ที่ดีนั้นเขียนยากและหาได้ยากเนื่องจากการเขียน Good OO ต้องใช้เวลา / ความรู้มากกว่าการเขียนโค้ดที่ใช้งานได้ดี

และเมื่อคุณมีงบ จำกัด เจ้านายของคุณมักไม่พอใจที่เห็นว่าคุณใช้เวลาทั้งวันในการเขียนชั้นเรียนมากมาย ...


3

ฉันไม่เห็นด้วยว่าคลาสยูทิลิตี้นั้นชั่วร้าย

แม้ว่าคลาสยูทิลิตี้อาจละเมิดหลักการ OO ในบางวิธี แต่ก็ไม่ได้เลวร้ายเสมอไป

ตัวอย่างเช่นสมมติว่าคุณต้องการฟังก์ชันที่จะล้างสตริงของค่าที่ตรงกันของสตริงย่อยทั้งหมด xตัวอย่างเช่นสมมติว่าคุณต้องการฟังก์ชั่นที่จะทำความสะอาดสตริงของทุกค่าสตริงจับคู่

stl c ++ (ณ ตอนนี้) ไม่รองรับสิ่งนี้โดยตรง

คุณสามารถสร้างส่วนขยายความหลากหลายของ std::string .

แต่ปัญหาคือคุณต้องการให้ทุกสตริงที่คุณใช้ในโปรเจ็กต์เป็นคลาสสตริงแบบขยายหรือไม่?

มีหลายครั้งที่ OO ไม่สมเหตุสมผลและนี่ก็เป็นหนึ่งในนั้น เราต้องการให้โปรแกรมของเราเข้ากันได้กับโปรแกรมอื่น ๆ ดังนั้นเราจะติดstd::stringและสร้างคลาสขึ้นมาStringUtil_ (หรือบางอย่าง)

ฉันว่าจะดีที่สุดถ้าคุณใช้หนึ่งยูทิลต่อคลาส ฉันว่ามันโง่มากที่มียูทิลิตี้เดียวสำหรับทุกคลาสหรือหลายยูทิลิตี้สำหรับคลาสเดียว


2

เป็นเรื่องง่ายมากที่จะสร้างแบรนด์ให้เป็นยูทิลิตี้เพียงเพราะผู้ออกแบบไม่สามารถนึกถึงตำแหน่งที่เหมาะสมในการใส่โค้ด มักจะมี "สาธารณูปโภค" ที่แท้จริงน้อย

ตามหลักการทั่วไปแล้วฉันมักจะเก็บรหัสไว้ในแพ็คเกจที่ใช้ครั้งแรกจากนั้นจะทำการ refactor เป็นสถานที่ทั่วไปมากขึ้นเท่านั้นหากฉันพบว่าในภายหลังจำเป็นต้องใช้ที่อื่นจริงๆ ข้อยกเว้นเพียงอย่างเดียวคือหากฉันมีแพ็กเกจที่ทำงานคล้ายกัน / เกี่ยวข้องกันอยู่แล้วและรหัสนั้นเหมาะสมที่สุด


2

คลาสยูทิลิตี้ที่มีวิธีการคงที่แบบไม่ระบุสถานะจะมีประโยชน์ สิ่งเหล่านี้มักจะง่ายมากในการทดสอบหน่วย


1

ด้วย Java 8 คุณสามารถใช้วิธีการแบบคงที่ในอินเทอร์เฟซ ... แก้ไขปัญหาได้


ไม่ได้แก้ไขปัญหาที่ระบุไว้ในstackoverflow.com/a/3340037/2859065
Luchostein

การใส่ในชั้นเรียนและการนำเข้าต่างกันอย่างไร
wilmol

1

ชั้นเรียน Util ส่วนใหญ่ไม่ดีเนื่องจาก:

  1. พวกเขาขยายขอบเขตของวิธีการ พวกเขาทำให้รหัสเป็นสาธารณะที่อาจเป็นส่วนตัว หากผู้โทรหลายคนต้องการวิธีการใช้งานในคลาสที่แยกจากกันและมีความเสถียร (เช่นไม่จำเป็นต้องอัปเดต) ในความคิดของฉันควรคัดลอกและวางวิธีการผู้ช่วยส่วนตัวลงในคลาสการโทร เมื่อคุณแสดงเป็น API แล้วคุณจะทำความเข้าใจได้ยากขึ้นว่าจุดเข้าสาธารณะไปยังส่วนประกอบของ jar คืออะไร (คุณรักษาโครงสร้างแบบต้นไม้ที่เรียกว่าลำดับชั้นโดยมีพาเรนต์เดียวต่อหนึ่งวิธีการนี้จะง่ายกว่าในการแยกทางจิตใจออกเป็นส่วนประกอบซึ่งยากกว่าเมื่อ คุณมีเมธอดที่เรียกจากเมธอดหลักหลายวิธี)
  2. ส่งผลให้รหัสตาย วิธีการใช้งานเมื่อเวลาผ่านไปจะไม่ได้ใช้งานเมื่อแอปของคุณพัฒนาขึ้นและคุณจะพบกับโค้ดที่ไม่ได้ใช้ซึ่งทำให้ฐานรหัสของคุณเป็นมลพิษ หากยังคงเป็นส่วนตัวคอมไพเลอร์ของคุณจะบอกคุณว่าไม่ได้ใช้วิธีการใดและคุณสามารถลบออกได้ (รหัสที่ดีที่สุดคือไม่มีรหัสเลย) เมื่อคุณทำให้วิธีการดังกล่าวไม่เป็นส่วนตัวคอมพิวเตอร์ของคุณจะไม่มีอำนาจที่จะช่วยคุณลบรหัสที่ไม่ได้ใช้ อาจเรียกได้จากไฟล์ jar อื่นสำหรับคอมพิวเตอร์ทุกคนที่รู้จัก

มีการเปรียบเทียบกับไลบรารีแบบคงที่และแบบไดนามิก


0

เมื่อฉันไม่สามารถเพิ่มเมธอดในคลาสได้ (กล่าวAccountคือถูกล็อกจากการเปลี่ยนแปลงโดย Jr. Developers) ฉันก็แค่เพิ่มวิธีการคงที่สองสามวิธีในคลาสยูทิลิตี้ของฉันดังนี้:

public static int method01_Account(Object o, String... args) {
    Account acc = (Account)o;
    ...
    return acc.getInt();
}  

1
ดูเหมือนว่าคุณจะเป็นจูเนียร์สำหรับฉัน .. : P วิธีที่ไม่ชั่วร้ายในการทำเช่นนี้คือขอให้ "Jr Developer" ของคุณปลดล็อกAccountไฟล์อย่างสุภาพ หรือดีกว่าให้ใช้ระบบควบคุมแหล่งที่มาแบบไม่ล็อค
Sudeep

1
ฉันคิดว่าเขาหมายความว่าAccountไฟล์ถูกล็อคเพื่อให้ Jr. Developers ไม่สามารถทำการเปลี่ยนแปลงได้ ในฐานะจูเนียร์ดีเวลอปเปอร์เพื่อหลีกเลี่ยงปัญหานี้เขาได้ทำตามที่กล่าวมา ที่กล่าวว่ายังดีกว่าที่จะได้รับสิทธิ์การเขียนไฟล์และดำเนินการอย่างถูกต้อง
Doc

การเพิ่ม +1 ในสิ่งนี้เนื่องจากการโหวตลดลงดูเหมือนจะรุนแรงเมื่อไม่มีใครรู้ว่าทำไมคุณถึงให้คำตอบนี้
joelc

0

คลาสยูทิลิตี้ไม่ได้ชั่วร้ายเสมอไป แต่ควรมีเฉพาะวิธีการที่ใช้กันทั่วไปในฟังก์ชันการทำงานที่หลากหลาย หากมีเมธอดที่ใช้ได้เฉพาะในคลาสจำนวน จำกัด ให้พิจารณาสร้างคลาสนามธรรมในฐานะพาเรนต์ทั่วไปและใส่เมธอดเข้าไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.