วิธีการตั้งค่าสถานะคลาสภายใต้การพัฒนาใน Java


12

ฉันทำงานในโครงการฝึกงาน แต่ฉันต้องจากไปก่อนที่ฉันจะสามารถทำทุกอย่างให้เสร็จได้

ฉันมี 1 คลาสที่ไม่เสถียรพอสำหรับการใช้งานจริง ฉันต้องการทำเครื่องหมาย / ตั้งค่าสถานะคลาสนี้เพื่อให้ผู้อื่นไม่ได้ใช้ในการผลิตโดยไม่ได้ตั้งใจ ฉันได้แจ้งให้ทราบแล้วใน Javadoc แต่นั่นก็ดูไม่เพียงพอ ข้อผิดพลาดหรือคำเตือนของคอมไพเลอร์จะดีกว่า

รหัสถูกจัดระเบียบเช่นนี้:

[Package] | company.foo.bar.myproject
          |-- Class1.java
          |-- Class2.java
          |-- Class3.java <--(not stable)

ถ้ามีระดับโรงงานเดียวที่เรียกผู้ที่อยู่ในชั้นเรียนวิธีการสาธารณะฉันจะได้กำหนดวิธีการที่จะเป็นclass3 privateอย่างไรก็ตาม API จะไม่ถูกเปิดเผยเช่นนั้น ผู้ใช้จะใช้คลาสเหล่านั้นโดยตรงเช่นnew Class1();แต่ฉันไม่สามารถสร้างคลาสส่วนตัวระดับสูงได้ วิธีที่ดีที่สุดในการจัดการกับสถานการณ์นี้คืออะไร


1
คุณหมายความว่าอย่างไร "API ไม่ถูกเปิดเผยด้วยวิธีการ" คลาสนี้มีวัตถุประสงค์เพื่อใช้ผ่าน Reflection API หรือไม่
Tom G

5
ข้อผิดพลาดของคอมไพเลอร์? ทำไมไม่เพียงแค่โยนข้อยกเว้นในตัวสร้าง?
Mchl

ขอโทษสำหรับความสับสน. ฉันแก้ไขโพสต์แล้ว
Wei Shi


1
คุณไม่สามารถทำให้คลาสเป็นส่วนตัว แต่คุณสามารถสร้างคอนสตรัคเตอร์เป็นส่วนตัวได้
Peter Taylor

คำตอบ:


15

ทำไมไม่เพียงแค่ตรวจสอบคลาสที่ไม่เสถียรทั้งหมดในสาขาอื่น ๆ ในระบบควบคุมเวอร์ชันของคุณ?


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

3
@c_maker: ให้ผู้อื่นรู้ว่าสาขานั้นมีอยู่และสิ่งที่อยู่ในนั้นควรเป็นส่วนหนึ่งของสิ่งที่ได้รับเมื่อเขาจากไป
Blrfl

2
@Birlf หากเขาเป็นกังวลเกี่ยวกับคนอื่นไม่เห็นคำอธิบายใน JavaDoc ของรหัสที่พวกเขาใช้ฉันสงสัยว่าพวกเขาจะไปหาเอกสารอื่น ๆ ที่เขาผลิต
KeithB

ความกังวลของฉันคือคุณสมบัติยังคงมีการพัฒนา แต่ต้นแบบการต่อสู้เลือกที่จะตั้งค่าไว้ด้วยเหตุผลใด ๆ (เลื่อนการชำระหนี้ที่บล็อกการทดสอบ E2E ในกรณีของเรา) หากเราไม่เข้าร่วมเป็นอาจารย์อาจมีหลายอย่างที่ต้องทำตามถนน เราเพิ่งทำให้ c`tor เป็นส่วนตัวและใส่คำอธิบายประกอบในชั้นเรียน @Experimental เหมือนใน Spark
Joey Baruch

11

หากคุณมีความเห็นถูกต้องระดับที่คุณสามารถทำเครื่องหมายบิตของการทำงานไม่สมบูรณ์ขณะที่ "เลิก" throw new UnsupportedOperationException();และหรือแสดงความคิดเห็นออกมาจากความกล้าของวิธีการและใส่

ดูมีอะไรที่คล้ายกับ NotImplementedException ใน. NET ของ Java หรือไม่ สำหรับรายละเอียด


2
นี่คือวิธีการจัดการ defacto ปัญญาตีในขณะที่ฉันเข้าใจสิ่งต่าง ๆ
Martijn Verburg

4

ฉันไม่ทราบคำเตือนของคอมไพเลอร์

ในสถานการณ์ของคุณฉันอาจใช้@Deprecatedคำอธิบายประกอบ มันจะตัดการเรียกวิธีการออกไป เมื่อพวกเขาดูว่ามีอะไรเกิดขึ้นพวกเขาจะเห็นความคิดเห็นของคุณเกี่ยวกับ 'ไม่พร้อมสำหรับการผลิต' และไปที่ AHA


2
การเรียกเมธอดจะถูกขีดฆ่าถ้า IDE รองรับเท่านั้น
FrustratedWithFormsDesigner

5
จริง แต่คนส่วนใหญ่อาจใช้หนึ่งใน IDE เหล่านั้นที่สนับสนุน
c_maker

3

ผมไม่คิดว่าจะมีวิธีการมาตรฐานของรหัสที่ทำเครื่องหมายว่าWIP, Incompleteหรือสิ่งที่ต้องการที่

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

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

คุณสามารถสร้างคำอธิบายประกอบที่มีชื่อWIP(เนื่องจากสิ่งที่ฉันคิดได้ใกล้เคียงที่สุดDeprecatedแต่มันไม่ได้มีความหมายเหมือนกัน) และใช้มันเพื่อใส่คำอธิบายประกอบในชั้นเรียน นี่อาจจะเป็นงานอีกเล็กน้อยและสิ่งที่จะสนับสนุนการเพิ่มความคิดเห็น?

ในที่สุดคุณก็สามารถใส่ไว้ในความคิดเห็น แต่จะใช้งานได้ถ้าผู้คนอ่านพวกเขาจริง

แก้ไข:

สิ่งนี้อาจมีความเกี่ยวข้อง: จะทำให้เกิดข้อความเตือน java compiler แบบกำหนดเองโดยเจตนาได้อย่างไร?


throw exception ทำให้ eclipse บ่นเกี่ยวกับโค้ดที่ไม่สามารถเข้าถึงได้ วิธีแก้ปัญหาใด ๆ
Wei Shi

@Usavich: ไม่แน่ใจตั้งแต่ฉันไม่เห็นรหัส แต่อาจจะช่วยป้องกันนักพัฒนาในอนาคตจากการใช้รหัส?
FrustratedWithFormsDesigner

@Usavich: ดูลิงค์ที่ฉันเพิ่มในการแก้ไขในโพสต์ของฉันมันเป็นคำถามที่คล้ายกันที่ OP ต้องการเพิ่มคำเตือนคอมไพเลอร์ที่กำหนดเอง อาจช่วยให้คุณเพิ่มคำอธิบายประกอบ "UnstableCode" ที่กำหนดเองได้
FrustratedWithFormsDesigner

3

ทำไมมันมีตั้งแต่แรก?

คุณตรวจสอบรหัสที่ไม่เสถียรในการฉีดหรือไม่ ทำไม?

ไม่ควรตรวจสอบรหัสที่ไม่เสถียรใน trunk / main / master หรือชื่อ trunk หลัก สิ่งนี้ถือว่าเป็นการพัฒนาที่มีความเสี่ยงสูงและควรถูกแยกออกจากสาขาของตัวเองที่คุณทำงานมากกว่าที่จะเช็คอินหลัก

ฉันจะขอแนะนำให้ท่าน (และนำทีมงานของคุณ) เพื่ออ่านกลยุทธ์ขั้นสูง SCM กิ่ง โดยเฉพาะอย่างยิ่งให้ความสนใจกับบทบาทการพัฒนาและสิ่งที่กล่าวเกี่ยวกับสิ่งที่ถือว่าเป็นการพัฒนาที่มีความเสี่ยงสูง:

โดยทั่วไปให้พิจารณาใช้สาขาแยกสำหรับแต่ละโครงการที่มีความเสี่ยงสูง โครงการที่มีความเสี่ยงสูงนั้นมีขนาดใหญ่จำนวนคนจำนวนมากหัวเรื่องที่ไม่คุ้นเคยหัวข้อทางเทคนิคที่สูงเส้นเวลาที่แน่นมากวันส่งมอบที่ไม่แน่นอนข้อกำหนดที่ไม่สมบูรณ์หรือระเหยและทีมงานกระจายโครงการ ในทำนองเดียวกันพิจารณากำหนดสาขาเดียวสำหรับการพัฒนาความเสี่ยงต่ำในแต่ละรุ่น มีหลายแหล่งรวมทั้ง [WING98] แนะนำให้ใช้การฉีดเพื่อจุดประสงค์นี้ พิจารณาปัจจัยที่กล่าวถึงข้างต้นสำหรับการฉีดก่อนที่จะกระทำการนี้ การพัฒนาความเสี่ยงต่ำอาจมีนโยบายที่แตกต่างจากการฉีดแม้ว่าคุณจะมีสมาชิกหลายคนในตระกูลผลิตภัณฑ์ประสานงานผ่านการฉีด

การให้ผู้คนตรวจสอบรหัสที่ไม่เสถียร (หรือไม่ได้ใช้) ลงในการฉีดหมายความว่าคุณจะสับสนระหว่างการพัฒนาในอนาคตเกี่ยวกับการพยายามรักษารหัสนี้ ทุกสาขาและโคลนของตัวแทนจากนี้ไปจนถึงวันสุดท้ายจะมีสิ่งนี้จนกว่าจะมีคนบอกว่า "codE ที่ตายแล้ว" และลบมัน

มีบางอย่างที่พูดว่า "ดีถ้ามันอยู่ในสาขามันจะถูกลืม" และในขณะที่มันอาจจะเป็นจริงการลืมรหัส (และไม่แน่นอน) ในการฉีดตายนั้นแย่กว่าหลายครั้งเพราะมันสับสนการพัฒนาในอนาคตทั้งหมดจนกว่ามันจะถูกลบออก - และ แล้วมันก็ยิ่งมากขึ้นลืม สาขาที่มีชื่ออย่างดีของ "/ fooProject / branches / WeisBigIdea" (หรือเทียบเท่า) สามารถมองเห็นได้และใช้งานได้ง่ายขึ้นในอนาคต - โดยเฉพาะอย่างยิ่งถ้าเป็นงาน

@Deprecated

สิ่งแรกคือ@Deprecatedหมายเหตุประกอบ สิ่งนี้นอกเหนือจาก javadoc และคายคำเตือนคอมไพเลอร์ javacจัดเตรียม-deprecationแฟล็กที่อธิบายดังนี้:

แสดงคำอธิบายของการใช้งานหรือการแทนที่ของสมาชิกหรือคลาสที่คัดค้าน โดยไม่ต้อง-deprecation, javacการแสดงบทสรุปของไฟล์ที่มาว่าการใช้งานหรือเลิกใช้แทนที่สมาชิกหรือเรียน -deprecation -Xlint:deprecationคือชวเลข

ดังที่กล่าวไว้ข้างต้นและเหนือกว่าคำเตือนของคอมไพเลอร์มาตรฐาน

ใน IDEs จำนวนมากวิธีการและค่าที่เลิกใช้จะแสดงด้วย strikethrough:

foo.bar();

และจะให้ผลผลิตเช่น:

$ javac -Xlint:all Foo.java Bar.java
Bar.java:2: warning: [deprecation] Foo in unnamed package has been deprecated
interface Bar extends Foo { }
                      ^

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

@CustomAnnotation

มีหลายวิธีในการนี้ ตัวอย่างเช่นการทำหมายเหตุประกอบแบบเบา javac @Warningซึ่งจัดเตรียมตัวประมวลผลคำอธิบายประกอบที่จะปิดการเตือนในเวลาคอมไพล์เมื่อมีการใช้คำอธิบายประกอบนั้น ( การสอน Netbeans บนตัวประมวลผลคำอธิบายประกอบแบบกำหนดเองเพื่อให้คุณทราบถึงสิ่งที่เกิดขึ้น ฉาก)

ออราเคิลแม้อธิบายตัวอย่างการใช้คำอธิบายประกอบที่กำหนดเองสำหรับนักการ@Unfinishedอธิบายประกอบในการทำมากที่สุดของของ Java Metadata, ส่วนที่ 2: คำอธิบายประกอบที่กำหนดเอง

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

โปรดทราบว่าทั้งหมดนี้แสดงถึงการเปลี่ยนการสร้างเพื่อใช้ตัวประมวลผลคำอธิบายประกอบ


2

คุณสามารถแนะนำการประมวลผลคำอธิบายประกอบเวลารวบรวมแต่สิ่งนี้จะบังคับให้สมาชิกทุกคนในทีมเพื่อปรับกระบวนการรวบรวมของพวกเขา

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

ดังนั้นคำแนะนำของฉันคือ: ถ้าคุณไม่สามารถแยกรหัสฐานโดยใส่ในสาขาต่าง ๆ แล้วพูดคุยกับผู้คนและอธิบายให้พวกเขาทำไมพวกเขาไม่ต้องใช้ API


0

คุณสามารถย้ายคลาสที่ไม่สมบูรณ์ทั้งหมดไปยังแพ็คเกจย่อยที่มีชื่อบางอย่างที่ชัดเจนเช่น "NOTCOMPLETE" ได้หรือไม่? มันเป็นเรื่องของการแฮ็ก แต่อาจมองเห็นได้พอสมควร

(หากไม่ได้อยู่ในแพ็คเกจเดียวกันคุณสามารถสร้างโครงสร้างแพ็คเกจใต้ใหม่ได้)


0

ฉันไม่รู้ว่ามีวิธีที่ดีในการทำเช่นนี้ในรหัส ย้อนกลับไป:

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

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


0

ฉันเลือกที่จะทำให้นามธรรมของชั้นเรียนและแสดงความคิดเห็นอย่างเหมาะสม - ด้วยวิธีนี้รหัสยังคงมีอยู่สำหรับการอ้างอิง แต่โชคดีสำหรับทุกคนที่พยายามที่จะยกตัวอย่าง :)


-1

สิ่งที่เกี่ยวกับการทำให้การพึ่งพาที่คอมไพเลอร์ไม่สามารถแก้ไขได้? เพียงเพิ่ม:

นำเข้า this.is.not.done.yet.do.not.use.it;

ไปด้านบน ผู้ใช้จะไม่สามารถรวบรวมได้

หากคุณต้องการทดสอบคลาสเพียงสร้างแพ็คเกจ / คลาสด้วยชื่อนั้น (หรือใช้ชื่อที่ง่ายกว่าเช่น "experiment.danger") และคุณสามารถทดสอบรหัสใหม่ได้


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