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


22

codebase ของเรานั้นเก่าและโปรแกรมเมอร์ใหม่อย่างฉันเรียนรู้ที่จะทำอย่างที่มันทำเพื่อความสม่ำเสมอ เมื่อคิดว่าเราจะต้องเริ่มต้นที่ไหนสักแห่งฉันก็เลยทำมันเองเพื่อสร้างคลาสของตัวยึดข้อมูลอีกครั้ง:

  • ลบเมธอด setter และสร้างฟิลด์ทั้งหมดfinal(ฉันใช้ " finalดี" ตามหลักการ) ตัวตั้งค่าถูกใช้เฉพาะในตัวสร้างเมื่อมันปรากฏออกดังนั้นสิ่งนี้จึงไม่มีผลข้างเคียง
  • แนะนำคลาส Builder

คลาส Builder นั้นจำเป็นเนื่องจากตัวสร้าง (ซึ่งเป็นสิ่งที่ให้การรีแฟคเตอร์ใหม่ในตอนแรก) ครอบคลุมโค้ดประมาณ 3 บรรทัด แต่ก็มีจำนวนมากของพารามิเตอร์

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

public void foo(Bar bar){
    //do stuff
    bar.setA(stuff);
    //do more stuff
    bar.setB(moreStuff);
}

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

public void foo(Bar bar){
    try{
        bar.setA(a);
        //enter exception-throwing stuff
        bar.setB(b);
    }catch(){}
}

หากข้อยกเว้นนั้นเริ่มทำงานbarจะมีข้อมูลที่เสียหายซึ่งจะหลีกเลี่ยงได้ด้วยตัวสร้าง:

public Bar foo(){
        Builder builder=new Builder();
    try{
        builder.setA(a);
        //dangerous stuff;
        builder.setB(b);
        //more dangerous stuff
        builder.setC(c);
        return builder.build();
    }catch(){}
    return null;
}

เพื่อนร่วมทีมของฉันตอบโต้ว่าข้อยกเว้นที่เป็นปัญหาจะไม่เกิดขึ้นซึ่งมีความยุติธรรมเพียงพอสำหรับรหัสเฉพาะนั้น แต่ฉันเชื่อว่าหายไปจากป่าสำหรับต้นไม้

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

ฉันใหม่กับ บริษัท นี้ (น้อยกว่า 6 เดือน) และตระหนักดีว่าฉันทำสิ่งนี้หาย คำถามที่ฉันมีคือ:

  • มีข้อโต้แย้งอื่น ๆ สำหรับการใช้ผู้สร้างแทนที่จะเป็น "วิธีเก่า" หรือไม่?
  • การเปลี่ยนแปลงที่ฉันเสนอนั้นคุ้มค่าหรือไม่

แต่จริงๆ

  • คุณมีเคล็ดลับใดบ้างที่จะนำเสนอข้อโต้แย้งดังกล่าวได้ดีขึ้นเมื่อพยายามสนับสนุนสิ่งใหม่ ๆ ?

6
ตัวสร้างจะต้องตั้งค่าอย่างใด ดังนั้นจึงไม่สามารถแก้ปัญหาพื้นฐานได้
Amy Blankenship

3
อะไรคือเหตุผลที่ (เพิ่มเติม / อันตราย / ข้อยกเว้นการขว้างปา) สิ่งที่ไม่สามารถเคลื่อนย้ายไปก่อนที่จะเรียกร้องให้setA?
yatima2975

2
พารามิเตอร์ตัวสร้าง 3 บรรทัดเท่านั้น ? นั่นไม่เลวเลย
pjc50

7
ในการออกแบบซอฟต์แวร์ใด ๆ จะมีการแลกเปลี่ยนระหว่างความซับซ้อนและการแยก แม้ว่าฉันคิดว่าฉันเห็นด้วยกับคุณเป็นการส่วนตัวว่าผู้สร้างเป็นทางออกที่ดีที่นี่ผู้ร่วมงานของคุณมีสิทธิ์ที่จะลังเลในเรื่องของ KISS ฉันบำรุงรักษาซอฟต์แวร์ที่ซับซ้อนเกินกว่าที่น่าอัศจรรย์ใจและเหตุผลส่วนหนึ่งเป็นเพราะการจ้างงานใหม่ทุกครั้งเป็นเรื่องหลอกลวงและกล่าวว่า "นี่โง่ฉันจะทำสิ่งใหม่ในแบบของฉัน" ดังนั้นเราจึงมี 5 เฟรมเวิร์คสำหรับกำหนดเวลา งานพื้นหลังและ 8 วิธีในการสอบถามฐานข้อมูล ทั้งหมดเป็นสิ่งที่ดีในการดูแลและไม่มีคำตอบที่ชัดเจนในกรณีเช่นนี้
แบรนดอน

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

คำตอบ:


46

เมื่อคิดว่าเราจะต้องเริ่มต้นที่ไหนสักแห่งฉันก็ต้องทำมันเองเพื่อสร้างคลาสของ data holder อีกครั้ง

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

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

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


7
"เซอร์ไพร์สนั้นดีถ้าเกี่ยวข้องกับปาร์ตี้"นั่นไม่จริงสำหรับทุกคน !! ฉันหยุดการพูดคุยกับเพื่อน ๆ เรียกว่าเพื่อให้โยนฉันแปลกใจอะไร , เป็นพิเศษบุคคล กับคนทั่วไป ฮึ.
Darkhogg

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

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

13
@Brandon มีคำพูด: "ถนนสู่นรกปูด้วยความตั้งใจดี" ความสอดคล้องไม่เพียง แต่ดีมันจำเป็น ! ลองนึกภาพว่าพยายามจัดการทีมนักพัฒนาซอฟต์แวร์ที่จัดการแอปพลิเคชั่นทั้งหมด 20 แอปซึ่งแต่ละแอปพลิเคชั่นเขียนในรูปแบบและ / หรือสถาปัตยกรรมที่แตกต่างกันเนื่องจากความชอบเทคโนโลยีปัจจุบันแนวโน้มและอื่น ๆ การทำให้ทีมยอมรับว่าสิ่งที่ควรเปลี่ยนอาจเป็นความแตกต่างระหว่างคนใหม่ที่ได้รับการยอมรับเพราะพวกเขาแก้ไขปัญหาที่ยืนยาวและถูกไล่ออกจากการเป็นทหารม้ากับสิ่งที่คุณคิดว่าดีที่สุด
DrewJordan

3
@Brandon - หากคุณกำลังจะไปโกงและแก้ไขบางสิ่งบางอย่าง "ที่ทุกคนเห็นด้วยที่ไม่ถูกต้อง" แล้วคุณอาจจะประสบความสำเร็จมากขึ้นโดยการเลือกสิ่งที่ "ทุกคนเห็นด้วยที่ไม่ถูกต้อง" แทนที่จะเลือกสิ่งที่ดีที่สุด หัวข้อเช่นความไม่สามารถเปลี่ยนแปลงได้ การออกแบบ / สถาปัตยกรรมที่ดีทำให้ค่าใช้จ่ายสูงไม่เปลี่ยนแปลงในทางปฏิบัติโดยไม่มีรางวัล ดังนั้นถ้าทีมของคุณมีปัญหาเพราะพวกเขาใช้เซเตอร์คุณก็ไม่ได้แก้ไขปัญหาเลย OTOH ถ้านี่เป็นแหล่งของข้อผิดพลาดบ่อย ๆ ดูเหมือนว่าการสร้างความชอบธรรมจะทำให้การตัดสินใจของทีมดีขึ้น
Dunk

21

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

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

อีกทางเลือกหนึ่งหากสถานการณ์ต้องการตัวติดตั้ง: เสนอวิธีในการตรึงโค้ดของคุณให้ตัวตั้งค่านั้นโยนข้อผิดพลาดในการยืนยัน (ข้อผิดพลาดของโปรแกรมโปรแกรมเมอร์) หากคุณพยายามแก้ไขฟิลด์หลังจากวัตถุพร้อม

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

เคล็ดลับทั่วไป

เก่า = ไม่ดีใหม่ = ดีวิธีของฉันวิธีของคุณ ... การสนทนาประเภทนี้ไม่สร้างสรรค์

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

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

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

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

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

ดังนั้นคำถามคือเกี่ยวกับวิธีการที่จะใช้เวลาและพลังงานของคุณที่ระบุว่าพวกเขาจะถูกจำกัด ? มีการเปลี่ยนแปลงอย่างต่อเนื่องกับซอฟต์แวร์ แต่โดยทั่วไปความคิดของคุณเริ่มต้นด้วยคะแนนลบจนกว่าคุณจะสามารถให้ข้อโต้แย้งที่ดี แม้ว่าคุณจะถูกเกี่ยวกับผลประโยชน์มันไม่ได้เป็นข้อโต้แย้งที่เพียงพอด้วยตัวเองเพราะมันจะจบในตะกร้า" Nice to have, one day ... "

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

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


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

@rath ไม่มีการพัฒนาโค้ดใหม่หรือไม่?
biziclop

@biziclop มีโมดูลใหม่ที่เสียบเข้ากับ codebase เก่า ฉันทำงานที่หนึ่งเมื่อเร็ว ๆ นี้ วันแห่งความสุข.
rath

5
@rath บางทีคุณอาจต้องการโครงการส่วนตัวที่คุณสามารถทำงานในเวลาที่คุณสามารถพัฒนาตนเองได้? ฉันไม่เชื่อตามอาร์กิวเมนต์รูปแบบ "Builder" ของคุณเช่นกัน getters / setters นั้นดูเหมือนจะเป็นทางออกที่สมบูรณ์แบบตามข้อมูลที่คุณให้มา จำไว้ว่าคุณต้องรับผิดชอบต่อนายจ้างและทีมของคุณ ลำดับความสำคัญของคุณคือทำให้แน่ใจว่างานใด ๆ ที่คุณทำนั้นเป็นประโยชน์ต่องานที่คุณรับผิดชอบ
Ben Cottrell

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

17

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

คุณทำไม่ได้

หากคอนสตรัคเตอร์ของคุณมีพารามิเตอร์ 3 บรรทัดมันใหญ่เกินไปและซับซ้อนเกินไป ไม่มีรูปแบบการออกแบบที่จะแก้ไขได้

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


มันเป็นผู้ถือข้อมูลขนาดใหญ่ของStrings และดั้งเดิมอื่น ๆ ไม่มีเหตุผลใด ๆ แม้แต่การตรวจสอบnulls ฯลฯ ดังนั้นมันจึงมีขนาดที่แท้จริงไม่ซับซ้อนต่อ se ฉันคิดว่าการทำอะไรบางอย่างเช่นbuilder.addA(a).addB(b); /*...*/ return builder.addC(c).build();จะง่ายขึ้นมากในสายตา
rath

8
@rath: มันเป็นผู้ถือครองข้อมูลขนาดใหญ่ของ Strings และข้อมูลพื้นฐานอื่น ๆ => จากนั้นคุณมีปัญหาอื่น ๆ หวังว่าไม่มีใครสนใจถ้าอีเมลฟิลด์ได้รับมอบหมายโดยที่อยู่โพสต์ของผู้ชาย ...
Matthieu M.

@MatthieuM ปัญหาหนึ่งที่ผมคิดว่าเวลา :)
rath

@rath - ดูเหมือนว่าการรวมรูปแบบการตรวจสอบความถูกต้องที่ดีจะมีประโยชน์มากกว่าและได้รับมากกว่าการพยายามคิดวิธีการสร้างรูปแบบตัวสร้างเป็นรหัสที่มีอยู่แล้ว ที่อื่นที่คุณพูดว่าคุณต้องการที่จะปรับปรุงตัวเอง การเรียนรู้วิธีที่จะได้รับประโยชน์สูงสุดจากความพยายามและผลที่ตามมาน้อยที่สุดนั้นเป็นคุณสมบัติที่ควรได้รับการพัฒนา
Dunk

1
ฉันมีสิ่งก่อสร้างมากมายที่มีพารามิเตอร์มากกว่านั้น จำเป็นในรูปแบบ IoC การวางนัยทั่วไปไม่ดีในคำตอบนี้
djechlin

16

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

ย้อนกลับที่

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

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

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


2
Frame your thoughts as suggestions and ideas. Get THEM to talk through THEIR ideas before asking questions to make them think about yours+1 สำหรับที่กระนั้น
rath

2
@rath โปรดจำไว้ว่าคนอื่นอาจไม่ได้อ่านหนังสือของคุณ อาจเป็นไปได้ว่าบุคคลที่คุณกำลังสนทนาด้วยถือเป็นการเผชิญหน้าซึ่งอาจเป็นผลดีต่อเป้าหมายของคุณ
Iker

2
@rath: ไม่มีถูกหรือผิด เพียงแค่ไม่ชอบการค้า และบ่อยครั้งที่การแลกเปลี่ยนไม่ได้เกี่ยวข้องกันมากกว่าแค่รหัสเท่านั้น
Marjan Venema

1
@Dunk ทั้งหมดที่มีอยู่คือการแลกเปลี่ยน เราเรียกมันว่าถูกหรือผิดเมื่อการแลกเปลี่ยนมีความชัดเจนและชัดเจนในด้านหนึ่ง อย่างไรก็ตามการตระหนักว่าเมื่อใดที่การแรเงานั้นเป็นการคลุมเครือนั้นจะง่ายกว่าหากเรามุ่งเน้นไปที่การแลกเปลี่ยนตั้งแต่ต้น
btilly

2
ไม่มีการตั้งโปรแกรมเดี่ยว "แนวปฏิบัติที่ดีที่สุด" ที่ฉันรู้ซึ่งไม่มีข้อยกเว้นที่ไม่ดีที่สุด บางครั้งมันก็ยากที่จะหาข้อยกเว้นเหล่านั้น แต่พวกเขาอยู่เสมอ
btilly

11

มีข้อโต้แย้งอื่น ๆ สำหรับการใช้ผู้สร้างแทนที่จะเป็น "วิธีเก่า" หรือไม่?

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

ถ้าฉันเป็น coleague ของคุณฉันจะถามคุณว่า "ทำไมไม่เริ่มต้นวัตถุทั้งหมดในตัวสร้าง?" นั่นคือสิ่งที่มันเป็นฟังก์ชั่นหลังจากทั้งหมด ทำไมต้องใช้รูปแบบการสร้าง (หรือการออกแบบอื่น ๆ )?

การเปลี่ยนแปลงที่ฉันเสนอนั้นคุ้มค่าหรือไม่

เป็นการยากที่จะบอกจากตัวอย่างรหัสขนาดเล็กนั้น อาจเป็น - คุณและเพื่อนร่วมทีมของคุณต้องประเมินมัน

คุณมีเคล็ดลับใดบ้างที่จะนำเสนอข้อโต้แย้งดังกล่าวได้ดีขึ้นเมื่อพยายามสนับสนุนสิ่งใหม่ ๆ ?

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


7

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

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

คำถามที่เกิดขึ้นจริง

ทำไมต้องใช้วัตถุที่ไม่เปลี่ยนรูป? เพราะคุณรู้ว่าคุณกำลังทำอะไรอยู่

สมมติว่าคุณมีการเชื่อมต่อฐานข้อมูลที่ส่งผ่านซึ่งอนุญาตให้คุณเปลี่ยนโฮสต์ผ่านตัวตั้งค่าแล้วคุณจะไม่ทราบว่าการเชื่อมต่อนั้นคืออะไร การไม่เปลี่ยนรูปแล้วคุณจะรู้

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

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

tl; DR

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


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

1
idk สิ่งที่จะตอบสมมติฐานของคุณ @Dunk ฉันไม่ได้พยายามเปลี่ยนทุกอย่างฉันพยายามทำความสะอาด และไม่ใช่คนที่รู้ว่าพวกเขากำลังทำอะไรพวกเขาสร้างคลาสและฟังก์ชั่นอย่างภาคภูมิใจซึ่งมีรหัสร้อยบรรทัดด้วย IDK จำนวนรัฐทั่วโลกและอื่น ๆ .. ระดับใกล้เคียงกับสวนอารมณ์ ดังนั้นฉันจึงออกแถลงการณ์ อย่าย้อนกลับไปเมื่อคุณสังเกตเห็นว่าตัวคุณเองอยู่ในตำแหน่งที่คุณจะต้องปรับตัวให้เข้ากับการฝึกฝนที่ไม่เหมาะสม
ซูเปอร์ฮีโร่

@Dunk ลองเปลี่ยนวิธีที่คนรหัสในฐานะสมาชิกในทีมไม่ใช่สิ่งที่ฉันทำ แต่ฉันบอกพวกเขาตั้งแต่เริ่มต้น; "ฉันจะไม่ทำงานในโครงการนี้โดยไม่ต้องเขียนใหม่ทั้งหมด"ถ้ารหัสเป็นขยะชิ้นหนึ่งนั่นคือ ถ้ามันไม่เหมาะสมก็ดี ... ถ้าอย่างนั้นมันก็เป็นการรวมกัน มันไม่ใช่แค่ความสะดวกสบาย แต่เกี่ยวกับความจริงที่ว่าฉันต้องสามารถรับผิดชอบสิ่งที่ฉันผลิตได้ ฉันไม่สามารถทำเช่นนั้นได้หากรหัสรอบข้างในโครงการยุ่งเหยิงไปหมด
ซูเปอร์ฮีโร่

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

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

2

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

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

// business objects

interface CharRange {
   public char getCharacter();
   public int getFrom();
   public int getTo();
}

class MultiCharRange implements CharRange {
   final char ch;
   final int from;
   final int to;

   public char getCharacter() { return ch; }
   public int getFrom() { return from; }
   public int getTo() { return to; }
}

class SingleCharRange implements CharRange {
   final char ch;
   final int position;

   public char getCharacter() { return ch; }
   public int getFrom() { return position; }
   public int getTo() { return position; }
}

// builders

class Builder1 {
   public Builder2 character(char ch) {
      return new Builder2(ch);
   }
}

class Builder2 {
   final char ch;
   int from;
   int to;

   public Builder2 range(int from, int to) {
      if (from > to) throw new IllegalArgumentException("from > to");
      this.from = from;
      this.to = to;
      return this;
   }

   public Builder2 zeroStartRange(int to) {
      this.from = 0;
      this.to = to;
      return this;
   }

   public CharRange build() {
      if (from == to)
         return new SingleCharRange(ch,from);
      else 
         return new MultiCharRange(ch,from,to);
   }
}

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

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

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

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


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

2

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

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

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

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


มันไม่ได้ออกแบบโดยคณะกรรมการซึ่งเป็นส่วนหนึ่งของเหตุผลว่าทำไมโค้ดถึงแย่มาก สิ่งที่ฉันคิดว่าดีเกินไป มันเป็น DTO แต่ฉันจะไม่แยกมันออกเป็นชิ้น ๆ ถ้า codebase ไม่ดีฐานข้อมูลนั้นแย่กว่านั้นมาก +1 (ส่วนใหญ่) สำหรับย่อหน้าสุดท้าย
rath
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.