มีวิธีการสั่งซื้อ Java วิธีการใด ๆ [ปิด]


159

ฉันมีคลาส ish ขนาดใหญ่ (40 วิธีหรือมากกว่านั้น) ซึ่งเป็นส่วนหนึ่งของแพ็คเกจที่ฉันจะส่งเป็นหลักสูตร ขณะนี้มีวิธีการที่ค่อนข้างสับสนในแง่ของสาธารณูปโภคสาธารณะ / ส่วนตัว ฯลฯ และฉันต้องการที่จะสั่งให้พวกเขาอย่างเหมาะสม มีวิธีมาตรฐานในการทำเช่นนี้หรือไม่? เช่นปกติฟิลด์จะแสดงรายการไว้ก่อนหน้าเมธอดตัวสร้างจะถูกแสดงรายการก่อนวิธีอื่นและ getters / setters จะคงอยู่ วิธีการที่เหลืออยู่?


โปรดทราบว่าเมื่อทำงานกับรหัสเช่นนี้ IDE ส่วนใหญ่อนุญาตให้คุณดูคำจำกัดความของสิ่งที่อยู่ภายใต้เคอร์เซอร์โดยอัตโนมัติ นี่หมายความว่าคุณไม่ต้องทำอะไรนอกจากดู
Thorbjørn Ravn Andersen

หากคุณมี 40 วิธีในชั้นเรียนเดียว - คุณทำผิด
Ben

คำตอบ:


132

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

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


1
+1 ฉันชอบที่จะจัดเรียงตามทัศนวิสัย Shame Eclipse ไม่สามารถทำสิ่งนี้ได้โดยอัตโนมัติ (มันมักจะจัดกลุ่มคอนสตรัคเตอร์ทั้งหมดเข้าด้วยกันและวิธีการทั้งหมดเข้าด้วยกัน)
finnw

16
@finnw ยื่นรายงานข้อผิดพลาด เป็นที่ทราบกันดีว่ามีการใช้สิ่งแปลก ๆ จากที่นั่น
Thorbjørn Ravn Andersen

3
@Ben: ประสบการณ์ของฉันคือการที่ "ไม่เคย" จะมีข้อยกเว้น
Jon Skeet

1
@JonSkeet ในบางกรณีที่ตัวอย่างการสั่งซื้อไม่มีความเกี่ยวข้องกันอีกต่อไปให้ลองทำการทดสอบคลาส ไม่ควรเขียนโค้ดไม่ดีจะดีกว่าแนะนำวิธีจัดเรียงรหัสที่ไม่ดี
Ben

1
@Ben: ฉันคิดว่าเราจะต้องเห็นด้วยที่จะไม่เห็นด้วย ผมเคยเขียนรหัสที่มีสมาชิกอย่างเป็นธรรมชาติจำนวนมากโดยไม่ละเมิดแยกของความกังวล ฯลฯ
จอนสกีต

121
  1. ตัวแปร Class (คงที่): ก่อนอื่นตัวแปรคลาสสาธารณะจากนั้นได้รับการป้องกันและจากนั้นส่วนตัว

  2. ตัวแปรอินสแตนซ์: สาธารณะครั้งแรกจากนั้นได้รับการป้องกันและส่วนตัวแล้ว

  3. ก่อสร้าง

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

ที่มา: http://www.oracle.com/technetwork/java/codeconventions-141855.html


4
นี่คืออายุ 15 ปีและอาจจะล้าสมัยไปนิดหน่อยกับการปรากฏตัวของ IDEs ที่ทันสมัย ​​...
assylias

16
@assylias: IMO ความสามารถในการอ่านไม่ขึ้นกับ IDE การรักษาความสงบก่อนที่ส่วนบุคคลจะดีกว่า
saurabheights

40

ลิงก์ที่แม่นยำยิ่งขึ้นไปยัง«ข้อกำหนดของรหัส»: «การประกาศคลาสและส่วนต่อประสาน»


8
+1, afaik - นี่คือโพสต์เดียวที่ตอบคำถามได้จริง ใช่มีออเดอร์มาตรฐานตามที่ Oracle และ Sun กำหนดไว้ดังนี้: 1. ความคิดเห็นสาธารณะ, 2. คลาส, 3. ความคิดเห็นภายใน, 4. ข้อมูลสแตติก, 5. ข้อมูลอินสแตนซ์, 6. cker, 7. เมธอดและภายในกลุ่มแต่ละส่วน เหตุผลไม่ใช่จากการเข้าถึง
John Henckel

@VadimKirilchuk « Internet Archive »ถูกลง…
Timofey Gorshkov


15

ไม่แน่ใจว่ามีมาตรฐานที่ยอมรับในระดับสากล แต่ความชอบของฉันคือ;

  • ก่อสร้างก่อน
  • วิธีการคงที่ต่อไปหากมีวิธีการหลักเสมอก่อนที่วิธีการคงที่อื่น ๆ
  • ไม่ใช่วิธีการคงที่ต่อไปมักจะอยู่ในลำดับความสำคัญของวิธีการตามด้วยวิธีการใด ๆ ที่มันเรียก ซึ่งหมายความว่าวิธีการสาธารณะที่เรียกใช้วิธีการเรียนอื่น ๆ จะปรากฏขึ้นที่ด้านบนและวิธีการส่วนตัวที่เรียกว่าไม่มีวิธีการอื่นมักจะจบลงที่ด้านล่าง
  • วิธีการมาตรฐานชอบtoString, equalsและhashcodeต่อไป
  • getters และ setters มีสถานที่พิเศษที่สงวนไว้ที่ด้านล่างของชั้นเรียน

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

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

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

@ LonelyNeuron ไม่แน่ใจว่าสิ่งที่คุณกำลังพูดอยู่ที่นี่ แต่ดูเหมือนว่าคุณกำลังบอกว่านวกรรมิกควรทำงานติดตั้งมากมายนอกเหนือจากการกำหนดอาร์กิวเมนต์ของมันให้เป็นสถานะภายใน นี่เป็นสิ่งที่ผิดอย่างแน่นอนเพราะมันหมายถึงสิ่งต่าง ๆ ที่เกิดขึ้นจาก "เวทมนตร์" การโทรไปยังnew Thing()ควรส่งผลให้เกิดสิ่งใหม่ที่ถูกอินสแตนซ์ ไม่ควรส่งผลให้เกิดการเชื่อมต่อฐานข้อมูลการเปิดไฟล์ที่กำลังเขียน ฯลฯ
GordonM

@LonelyNeuron การมีผู้พึ่งพาในคอนสตรัคเตอร์ไม่ได้บอกอะไรคุณเกี่ยวกับการติดตั้งคลาสนอกเหนือจากการพึ่งพา นี่เป็นสิ่งที่ดีไม่ใช่สิ่งเลวร้าย
GordonM

12

40 วิธีในคลาสเดียวนั้นค่อนข้างมาก

มันจะทำให้ความรู้สึกที่จะย้ายบางส่วนของฟังก์ชั่นอื่น ๆ - ชื่อเหมาะสม - คลาส จากนั้นมันง่ายกว่ามากที่จะเข้าใจ

เมื่อคุณมีจำนวนน้อยลงจะง่ายกว่ามากที่จะแสดงรายการตามลำดับการอ่านตามธรรมชาติ กระบวนทัศน์ที่พบบ่อยคือการแสดงรายการสิ่งต่าง ๆก่อนหรือหลังที่คุณต้องการตามลำดับที่คุณต้องการ

ซึ่งมักจะหมายถึงสิ่งที่main()อยู่ด้านบนหรือด้านล่าง


1
คุณพูดถูก - นี่ไม่ใช่ปัญหาการสั่งซื้อ
kostja

4
คุณไม่มีทางเลือกเสมอไปตัวอย่างเช่นหากคุณใช้อินเทอร์เฟซด้วยวิธีการมากมาย
finnw

5
นี้เป็นกิจกรรม Android ดังนั้นมีจำนวนมากที่ไม่สามารถไปได้ทุกที่อื่นonPause(), onResume()ฯลฯ รวมเป็นทั้งหมดของฉันOnClickListenerสาขาซึ่งแม้ว่าพวกเขาจะฟิลด์ไม่ได้ดูหรือทำตัวเหมือนพวกเขาดังนั้นจึงเป็นเรื่องที่เหมาะสมที่จะ แสดงรายการแยกต่างหาก
fredley

@finnw คลาสนามธรรมนั้นดีและใช้งานได้สำหรับจุดประสงค์นี้
Thorbjørn Ravn Andersen

11

"อนุสัญญา" ของฉัน: คงที่ก่อนอินสแตนซ์สาธารณะก่อนส่วนตัวคอนสตรัคก่อนวิธีการ แต่วิธีหลักที่ด้านล่าง (ถ้ามี)


2

นอกจากนี้ eclipse ยังมีความเป็นไปได้ในการเรียงลำดับสมาชิกชั้นเรียนสำหรับคุณด้วยเหตุผลบางอย่างที่ทำให้พวกเขาสับสน:

เปิดไฟล์คลาสของคุณไปที่ "แหล่งที่มา" ในเมนูหลักและเลือก "เรียงสมาชิก"

นำมาจากที่นี่: วิธีการเรียงลำดับใน Eclipse


1

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

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