คำสั่งใดที่ใช้กำหนดตัวตั้งค่าและตัวตั้งค่า [ปิด]


14

มีวิธีปฏิบัติที่ดีที่สุดสำหรับการสั่งซื้อเพื่อกำหนด getters และ setters หรือไม่ ดูเหมือนจะมีสองวิธี:

  • คู่ getter / setter
  • getters แรกจากนั้น setters (หรือวิธีอื่น ๆ )

เพื่อเพิ่มความแตกต่างนี่คือตัวอย่าง Java ของคู่ getter / setter:

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public int getVar2() {
    return var2;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

และนี่คือตัวอย่าง Java ของ getters แรกจากนั้น setters:

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public int getVar2() {
    return var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

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

คำตอบ:


8

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

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

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


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

เพิ่มเหตุผลบางอย่าง
เบเนดิกต์

25

หากคุณอยู่ในทีมทำสิ่งที่พวกเขามักจะทำ มิฉะนั้นเพียงเลือกคนที่คุณชอบมากกว่า ในระดับของตัวเลือกการออกแบบที่สำคัญอาจเป็นที่ไหนสักแห่งใกล้ "ฉันควรใช้นิ้วหัวแม่มือกดที่ space bar หรือไม่?"


7
เห็นด้วยอย่างสมบูรณ์ สิ่งนี้อยู่ภายใต้หัวข้อของ "ไม่ต้องกังวลกับสิ่งเล็ก ๆ น้อย ๆ " ซึ่งควรเป็นกฎมาตรฐานการเข้ารหัสของทุกคน # 0 ( เป็นกฎ # 0 ใน "มาตรฐานการเข้ารหัส C ++" โดย Herb Sutter และ Andre Alexandrescu)
David Hammen

ฉันแน่ใจว่าผู้คนถกเถียงกันมากมายเกี่ยวกับนิ้วหัวแม่มือที่พวกเขาควรใช้ในการกด space bar)))
superM

@Michael ฉันเป็นคนที่ถนัดเหมือนกัน ฉันพยายามใช้ด้านซ้ายโดยเฉพาะ แต่มันยากมากและการพิมพ์ของฉันช้าลงในการรวบรวมข้อมูล
axblount

@axblount ฉันถนัดขวา แต่ใช้นิ้วหัวแม่มือซ้ายเสมอ ลองใช้สิทธิ์ของฉันและมีประสบการณ์แบบเดียวกับที่คุณอธิบาย ฉันพิมพ์ "y" ด้วยมือซ้ายด้วยเหตุผลบางอย่าง
KChaloux

6

นอกจากนี้ยังสามารถขึ้นอยู่กับภาษา ใน Java ไม่มีประโยชน์จริง ๆ ในการสั่งซื้อ แต่ใน C # คุณมีแนวคิดของ "คุณสมบัติ" ซึ่งกลุ่ม getter และ setter เข้าด้วยกันดังนั้นจึงบังคับใช้การเรียงลำดับนั้น ในภาษาอย่าง C ++ ที่คุณอาจต้องการทัศนวิสัยที่แตกต่างกันสำหรับ getters vs. setters (เช่น private setter, getter สาธารณะ) คุณอาจทำตรงกันข้ามเนื่องจากตัวปรับการมองเห็นจะให้หนึ่งครั้งสำหรับหลายวิธีแทนที่จะเป็นรายบุคคล .


5

เท่าที่ฉันรู้ไม่มีการประชุมเดี่ยว ส่วนOracle Java Code Conventions ในองค์กรไฟล์ไม่ได้กล่าวถึงตำแหน่งของ getters และ setters อย่างชัดเจน แต่กล่าวว่า:

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

นี่ไม่ได้ให้คำแนะนำใด ๆ - ฉันสามารถยืนยันได้ว่าตำแหน่งใดตำแหน่งหนึ่งตรงกับเกณฑ์นี้

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

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

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

ทางออกที่ดีที่สุดคือให้สอดคล้องกับไฟล์ต่าง ๆ ในโครงการ ค้นหามาตรฐานจัดทำเอกสารและติดกับมัน


1

จัดกลุ่มผู้ทะเยอทะยานและผู้ตั้งค่าสำหรับเขตข้อมูลเดียวเข้าด้วยกันเป็นคู่

การจัดกลุ่ม getters ทั้งหมดเข้าด้วยกันและ setters ทั้งหมดเข้าด้วยกันทำให้ยากที่จะบอกว่าฟิลด์ใดมีเพียง getters หรือ justters setters

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


ดังนั้นคุณโต้แย้งว่า getters สำหรับเขตข้อมูลควรจับคู่กับ getters สำหรับเขตข้อมูลนั้นเนื่องจากทำให้ง่ายต่อการดูภาพรวมว่าเขตข้อมูลบางอย่างในชั้นเรียนมีการจัดการอย่างไร
NN

นั่นและโมเดลเชิงแนวคิดของคลาสคืออะไร ชั้นเรียนควรได้รับการจัดระเบียบเป็นหลักตามหน้าที่การใช้งาน เมื่อสร้างคลาสคุณอาจตัดสินใจว่าต้องการฟิลด์ที่เปิดเผยต่อสาธารณะและไม่แน่นอน นั่นคือแนวคิด "การทำงาน" ไม่ใช่การแสดงออกทางไวยากรณ์ผ่านวิธี getter และ setter
M. Dudley

0

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


ฉันรู้เรื่องนี้ อย่างไรก็ตามเช่นใน Eclipse คุณสามารถเลือกระหว่าง orderings
NN

ขวา. ตัวเลือกเริ่มต้น "Fields in getter / setter pairs" ดูเหมือนว่ามีประโยชน์มากกว่าเพราะคุณสามารถเพิ่มฟิลด์เพิ่มเติมและสร้าง accessors เพิ่มเติมได้ในภายหลังโดยไม่ต้องกังวลว่าวิธีการใดที่จะไป
281377
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.