“ แนวทางปฏิบัติที่ดีที่สุด” ยอดนิยมแบบใดที่ไม่ได้ดีที่สุดเสมอไปและเพราะอะไร [ปิด]


100

"แนวปฏิบัติที่ดีที่สุด" มีอยู่ทั่วไปในอุตสาหกรรมของเรา การค้นหาของ Google ในเรื่อง "การเขียนโค้ดวิธีปฏิบัติที่ดีที่สุด" มีผลลัพธ์เกือบ 1.5 ล้านรายการ ความคิดที่ดูเหมือนจะนำความสะดวกสบายให้กับหลาย ๆ คน; เพียงทำตามคำแนะนำและทุกอย่างจะดีขึ้น

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

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

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

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

ฉันต้องการรับฟังตัวอย่างและประสบการณ์ที่เฉพาะเจาะจง


8
ข้อปฏิบัติที่คุณไม่เห็นด้วยคืออะไร
Sergio Acosta

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

สิ่งหนึ่งที่ฉันชอบเกี่ยวกับหนังสือ "Code Complete" โดย Steve McConnell คือเขาสำรองเคล็ดลับทั้งหมดของเขาพร้อมหลักฐานและการวิจัย เพียงแค่พูดใน '
JW01

5
@ วอลเตอร์: นี่เปิดมาหลายเดือนแล้วมันช่างสร้างสรรค์จริงๆ
Orbling

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

คำตอบ:


125

ฉันคิดว่าคุณตีเล็บที่หัวด้วยข้อความนี้

ฉันเกลียดที่จะทำสิ่งที่มีมูลค่าและไม่คิดถึงพวกเขาอย่างยิ่ง

ฉันเพิกเฉยแนวทางปฏิบัติที่ดีที่สุดเกือบทั้งหมดเมื่อไม่มีคำอธิบายว่าทำไมจึงมีอยู่

เรย์มอนด์เฉินทำให้บทความนี้ดีที่สุดเมื่อเขาพูด

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


4
คำพูดที่ยอดเยี่ยม
David Thornley

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

3
ฉันหวังว่าผู้คนจะไม่ใช้สิ่งนี้เป็นข้ออ้างที่จะไม่มองหาว่าอะไรคือเหตุผลเบื้องหลังการปฏิบัติที่ดีที่สุด ;) น่าเสียดายที่ฉันเห็นนักพัฒนาที่มีทัศนคติเช่นนี้
Vetle

3
เหตุผลเป็นสิ่งที่ดี การวิจัยดีกว่า
Jon Purdy

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

95

อาจโยนสิ่งนี้ลงในวงแหวน:

Premature optimization is the root of all evil.

ไม่มันไม่ใช่.

คำพูดที่สมบูรณ์:

"เราควรลืมประสิทธิภาพเล็กน้อยพูดถึง 97% ของเวลา: การปรับให้เหมาะสมก่อนกำหนดเป็นรากฐานของความชั่วร้ายทั้งหมด แต่เราไม่ควรพลาดโอกาสที่สำคัญ 3%"

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

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

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


4
+1 สำหรับหมายเลขที่แข็งแกร่งไม่ใช่
สตีเฟ่น

21
แต่ถ้าคุณได้รับการยอมรับแล้วว่าการเพิ่มประสิทธิภาพหนึ่งอย่างนั้นอยู่ในช่วงวิกฤต 3% คุณจะปรับตัวเร็วขึ้นหรือไม่?
John

7
@ Robert: แล้วอะไรคือจุดที่ไม่เห็นด้วยกับแถลงการณ์ว่า "การปรับให้เหมาะสมก่อนกำหนดเป็นรากของความชั่วร้ายทั้งหมด"?
จอห์น

8
ไม่เคยมาก่อนที่จะเพิ่มประสิทธิภาพการออกแบบระดับสูงและการตัดสินใจทางเทคนิคเช่นการเลือกภาษา อย่างไรก็ตามบ่อยครั้งที่มันเกิดขึ้นหลังจากที่คุณเสร็จสิ้นการออกแบบเป็นส่วนใหญ่เท่านั้นซึ่งมันก็ไร้ประสิทธิภาพซึ่งก็เป็นเหตุผลว่าทำไม Fred Brooks จึงกล่าวว่าทีมส่วนใหญ่เขียนเวอร์ชั่นทิ้งไปไม่ว่าพวกเขาจะตั้งใจหรือไม่ก็ตาม อีกเหตุผลสำหรับการสร้างต้นแบบ
Dominique McDonnell

8
@Robert ข้อความ Knuth ได้รับการปรับให้เหมาะสมก่อนกำหนด ...

94

หนึ่งผลตอบแทนต่อฟังก์ชั่น / วิธี


7
ฉันกำลังจะใส่สิ่งนี้ ฉันรักฉันบางคำสั่งกลับมาก่อน
Carson Myers

4
แน่นอน! ผู้คนต่างคิดค้นโปรแกรมโฟลว์ที่น่าสนใจเพื่อหลีกเลี่ยงreturnคำแถลงก่อน โครงสร้างการควบคุมที่ซ้อนกันอย่างลึกซึ้งหรือการตรวจสอบอย่างต่อเนื่อง นี้สามารถขยายวิธีif returnจริงๆเมื่อสามารถทำให้ปัญหานี้ง่ายขึ้น
snmcdonald

4
หากคุณต้องการผลตอบแทนหลายครั้งในฟังก์ชั่น (นอกเหนือจากการ์ด) ฟังก์ชั่นของคุณอาจยาวเกินไป
EricSchaefer

18
ไม่มีจุดในการมีคำหลักส่งคืนยกเว้นว่ามีวัตถุประสงค์เพื่อให้ปรากฏในหลาย ๆ ที่ กลับก่อนกลับมาอีกบ่อย มันจะให้บริการเพื่อทำให้รหัสของคุณง่ายขึ้นเท่านั้น หากผู้คนสามารถเข้าใจว่างบแตก / ดำเนินการต่อทำไมพวกเขาต่อสู้กับการกลับมา?
Evan Plaice

7
ฉันคิดว่านี่เป็นวิธีปฏิบัติที่ดีที่สุดที่ล้าสมัย ฉันไม่คิดว่ามันเป็นวิธีปฏิบัติที่ดีที่สุดที่ทันสมัย
Skilldrick

87

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

ปัญหาคือว่าแก้ปัญหาที่เหมาะสม 100% ไม่ค่อยมีอยู่ อาจมีวิธีแก้ปัญหาที่เหมาะสม 80% และอาจใช้งานได้ดี แต่ประมาณ 60% เหมาะสมล่ะ 40%? คุณวาดเส้นที่ไหน หากคุณไม่วาดเส้นคุณสามารถจบการรวมไลบรารี่ของโครงการเข้ากับโปรเจ็กต์ของคุณเพราะคุณใช้ฟีเจอร์ของมัน 10% เพียงเพราะคุณต้องการหลีกเลี่ยง

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


3
ฉันมีสิ่งนี้เกิดขึ้นในทางตรงกันข้าม ฉันสร้างส่วนประกอบ ajax grid ของตัวเองเพราะในขณะนั้นไม่มีใครทำสิ่งที่ฉันต้องการ แต่ต่อมาแทนที่มันด้วยกริด Ext JS มันช่วยให้ฉันตั้งสมมติฐานตั้งแต่ต้นว่าเลเยอร์การแสดงผลจะถูกแทนที่
Joeri Sebrechts

20
ตกลง ถ้าไม่มีใครคิดค้นล้อใหม่เราก็จะขับรถของเราด้วยยางไม้
ศิษย์ของ Dr. Wily

6
ฉันรู้สึกเหมือนเป็นตัวอย่าง 10% ของคุณเสมอเมื่อฉันเพิ่ม Boost ในโครงการ C ++ ฉันมักจะต้องน้อยกว่า 10% ของมันโดยตรง แต่แน่นอนฟังก์ชั่นที่ผมต้องนำเข้าโมดูลอื่น ๆ ที่นำเข้าโมดูลอื่น ๆ ซึ่ง ...
โรมัน Starkov

3
+1: เพียงแค่สัปดาห์นี้ฉันได้คิดค้นล้อใหม่ (เช่นแทนที่ปลั๊กอิน jquery ที่ได้รับความนิยมที่เราใช้โดยบางสิ่งที่เหมาะกับความต้องการของเรา แต่ยังแยกส่วน) และทำให้ประสิทธิภาพเพิ่มขึ้นอย่างมาก นอกจากนี้ยังมีผู้คนที่ทำงานอย่างแท้จริงในการคิดค้นล้อใหม่: ใช้ Michelin เช่นพวกเขาทำการวิจัยและพัฒนาเพื่อปรับปรุงยาง
wildpeaks

2
@Dr เจ้าเล่ห์ล้อเหล่านั้นไม่ได้คิดค้นใหม่พวกเขา refactored!

78

"หน่วยทดสอบทุกอย่าง"

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

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


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

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

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

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

13
@ n1ck TDD ไม่ใช่แบบฝึกหัดการทดสอบเท่าที่เป็นแบบฝึกหัดการออกแบบ แนวคิดคือคุณพัฒนาการออกแบบของคุณผ่านการทดสอบ (ซึ่งทำให้ API ที่เหมาะสมสำหรับสิ่งของของคุณ) ได้อย่างรวดเร็วแทนที่จะปรับการทดสอบให้เหมาะกับการออกแบบที่มีอยู่ (ซึ่งอาจไม่ดี / ไม่เพียงพอ) ไม่เลยคุณไม่จำเป็นต้องมีการออกแบบที่เหมาะสมในการทำแบบทดสอบก่อน
อดัมเลียร์

57

เสมอโปรแกรมอินเตอร์เฟซ

บางครั้งจะมีเพียงการใช้งานเพียงครั้งเดียว หากเราชะลอกระบวนการแยกอินเทอร์เฟซจนกระทั่งถึงเวลาที่เราเห็นความต้องการใช้งานเรามักจะพบว่าไม่จำเป็น


4
ตกลงคุณโปรแกรมไปยังอินเทอร์เฟซเมื่อคุณต้องการอินเทอร์เฟซ (เช่น API มั่นคงในการทำงานจาก)
Robert Harvey

45
ในการอ่านของฉันกฎนี้ไม่ได้เกี่ยวกับอินเตอร์เฟซเป็นภาษาที่สร้าง หมายความว่าคุณไม่ควรตั้งสมมุติฐานใด ๆ เกี่ยวกับการทำงานภายในของชั้นเรียนเมื่อเรียกวิธีการของมันและควรพึ่งพาสัญญา API เท่านั้น
Zsolt Török

2
ตกลงนี่เป็นคำถามที่น่าสนใจ - ฉันเป็นนักพัฒนา. NET เป็นหลักดังนั้นสำหรับฉันอินเตอร์เฟสของฉันดูเหมือนว่า IBusinessManager หรือ IServiceContract สำหรับฉันนี่เป็นระบบนำทางที่แสนง่าย (และโดยทั่วไปแล้วฉันจะเก็บอินเทอร์เฟซของฉันไว้ในเนมสเปซอื่น [หรือแม้แต่โครงการอื่น]) เมื่อฉันใช้ Java ฉันได้พบความสับสนนี้จริง ๆ (โดยทั่วไปแล้วการใช้งานอินเทอร์เฟซที่ฉันเคยเห็นมีคำต่อท้ายด้วย. impl - และอินเทอร์เฟซไม่มีการวิเคราะห์) นี่อาจเป็นปัญหาของมาตรฐานรหัสหรือไม่ แน่นอนว่าอินเตอร์เฟสในจาวาทำให้โค้ดดูยุ่งเหยิง - มันดูเหมือนกับคลาสปกติเมื่อมองแวบแรก
วัตสัน

5
@ วัตสัน: หนึ่งค่าใช้จ่ายคือทุกครั้งที่ฉันกด F3 ('ข้ามไปยังการประกาศ') ในการเรียกใช้เมธอดใน Eclipse ฉันจะข้ามไปยังอินเทอร์เฟซ ฉันต้องควบคุม -T, ลูกศรชี้ลง, กลับไปที่การใช้งาน นอกจากนี้ยังบล็อกการปรับโครงสร้างอัตโนมัติบางอย่างเช่นคุณไม่สามารถอินไลน์วิธีข้ามข้อกำหนดของอินเทอร์เฟซได้
Tom Anderson

4
@ ทอม: ดีครับผมยินดีที่จะมีส่วนร่วมกับคุณในสงคราม Eclipse vs. Intellij - อย่างไรก็ตามฉันมีรหัสทางศีลธรรมอันยอดเยี่ยมซึ่งทำให้ฉันไม่สามารถเผชิญหน้ากับใครบางคนที่มีแต้มต่อชัดเจน BOOM ฉันไม่ได้บอกว่า Eclipse ไม่ดีฉันกำลังบอกว่าถ้าฝ่ายอักษะใช้มันเพื่อสร้างหรือออกแบบเครื่องจักรสงครามของพวกเขาตอนนี้ WWII จะเป็นที่รู้จักในชื่อ "kerfuffle สองวัน" อย่างจริงจังแม้ว่าฉันพบว่ามันไม่มีขัดบางอย่างที่ฉันได้รับใน IDEs แบบนอกชั้นวาง (Intellij / VS + ReSharper) ฉันพบว่าตัวเองต่อสู้มากกว่าหนึ่งครั้ง - ซึ่งมากเกินไป
วัตสัน

46

อย่าใช้อะไรก็ตามโอเพนซอร์ซ (หรือไม่ใช่ของ Microsoft สำหรับนักพัฒนา. NET ของคุณ)

ถ้า Microsoft ไม่พัฒนา - เราจะไม่ใช้ที่นี่ ต้องการใช้ ORM - EF, ต้องการใช้ IOC - Unity, ต้องการบล็อกแอปพลิเคชันบันทึกองค์กร มีห้องสมุดที่ดีกว่าอยู่มากมาย แต่ฉันยังคงสั่งซื้อจากเมนูดอลล่าร์ของโลกแห่งการพัฒนาอยู่เสมอ ฉันสาบานทุกครั้งที่ฉันได้ยินแนวทางปฏิบัติที่ดีที่สุดของ Microsoft ฉันคิดว่า "แนวทางโภชนาการของแมคโดนัลด์" แน่นอนว่าคุณจะมีชีวิตอยู่หากคุณติดตามพวกเขา แต่คุณจะขาดสารอาหารและมีน้ำหนักเกิน

  • โปรดทราบว่านี่อาจไม่ใช่วิธีปฏิบัติที่ดีที่สุดของคุณแต่เป็นสิ่งที่ปฏิบัติกันทั่วไปตามเกือบทุกที่ที่ฉันทำงาน

13
ฟังดูน่ากลัว ... = (ฉันอาจจะมากเกินไปในด้านอื่น ๆ แต่ฉันหลีกเลี่ยง M $ มากที่สุด
Lizzan

นั่นไม่ควรเป็นอย่างนั้น ควรเลือกห้องสมุดตามความคุ้มค่าไม่ใช่เพียงพิจารณาว่าใครเป็นคนทำ ตัวอย่างเช่นฉันรัก EF แต่ฉันมีประสบการณ์ไม่ดีกับ Enterprise Library และพบเครื่องมือที่ดีกว่าสำหรับการตรวจสอบและการบันทึกเช่น FluentValidation, log4net และ Elmah
Matteo Mosca

4
คุณจะไม่โดนไล่ออกเพราะซื้อ IBM ^ wMicrosoft
Christopher Mahan

17
นอกจากนี้ยังมีรุ่นมิเรอร์อิมเมจเช่นห้ามใช้อะไร Microsoft หรือไม่ใช้อะไรที่คุณต้องจ่าย
Richard Gadsden

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

40

การวางแนววัตถุ

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


7
ฉันนึกภาพไม่ออกว่าจะสร้างระบบซอฟต์แวร์ที่มีขนาดสำคัญใด ๆ โดยไม่ได้รับประโยชน์จากองค์กรที่ Object Orientation มอบให้
Robert Harvey

18
โรเบิร์ต Unix ไม่ใช่เชิงวัตถุและแน่นอนว่าเป็นระบบซอฟต์แวร์ที่มีขนาดใหญ่ ดูเหมือนว่าจะค่อนข้างเป็นที่นิยม (คิดว่า Mac OSX, iPhone, โทรศัพท์ Android และอื่น ๆ )
Christopher Mahan

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

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

9
สิ่งที่ตลกคือนอกเหนือจากการใช้คลาส polymorphism และไลค์แล้วโค้ดเชิงวัตถุส่วนใหญ่ก็คือรหัสขั้นตอนในความเป็นจริง
Oliver Weiler

35

รหัสทั้งหมดควรได้รับการแสดงความคิดเห็น

ไม่มันไม่ควรจะเป็น บางครั้งคุณมีรหัสที่ชัดเจนตัวอย่างเช่นผู้ตั้งค่าไม่ควรแสดงความคิดเห็นจนกว่าพวกเขาจะทำอะไรเป็นพิเศษ นอกจากนี้ทำไมฉันควรแสดงความคิดเห็นนี้:

/** hey you, if didn't get, it's logger. */
private static Logger logger = LoggerFactory.getLogger(MyClass.class);

13
รหัสทั้งหมดควรเข้าใจได้ ความคิดเห็นเป็นเครื่องมือสำคัญในการนั้น แต่ห่างไกลจากที่เดียว
Trevel

รหัสควรเข้าใจได้ แต่ไม่มีเหตุผลเดียวที่จะเขียนความคิดเห็นซึ่งจะไม่เพิ่มอะไรลงไปเช่นชื่อเมธอด ถ้าคุณเขียน/** sets rank. */ void setRank(int rank) { this.rank = rank; }ฉันถือว่าความคิดเห็นเป็นคนโง่ ทำไมมันเขียน?
Vladimir Ivanov

2
สร้างเอกสาร นั่นคือ/** */รูปแบบที่ใช้แทน/* */ความคิดเห็นของรูปแบบ หรือสำหรับ. NET ก็น่าจะเป็น///
Berin Loritsch

10
การใช้}//end if, }//end for, }//end whileเป็นตัวอย่างที่ดีที่สุดของการสิ้นเปลืองการแสดงความคิดเห็นที่ฉันเคยพบ ฉันเคยเห็นมาแล้วหลายครั้งที่วงเล็บปีกกาเปิดไม่เกิน 2 บรรทัด IMHO หากคุณต้องการความคิดเห็นเหล่านี้ดังนั้นรหัสของคุณจำเป็นต้องได้รับแฟคตอริ่งใหม่ ... หรือคุณต้องใช้เงิน 20 เหรียญและซื้อตัวแก้ไข IDE / Text ที่เน้นการจับคู่ที่ตรงกัน
scunliffe

7
รหัสพูดว่า "อย่างไร" ความคิดเห็นต้องพูดว่า "ทำไม"

32

วิธีการโดยเฉพาะอย่างยิ่งการต่อสู้ ฉันไม่สามารถรักษาหน้าตรงได้เมื่อฉันได้ยินผู้ใหญ่ใช้วลี "Scrum Master" ฉันรู้สึกเบื่อหน่ายกับการได้ยินนักพัฒนาประท้วงว่าบางแง่มุมของระเบียบวิธี X ไม่ได้ทำงานให้กับ บริษัท ของพวกเขาเท่านั้นที่จะได้รับการบอกเล่าจาก Guru So-and-ดังนั้นเหตุผลที่มันไม่ทำงานก็เพราะพวกเขาไม่ใช่ผู้ปฏิบัติจริง of Methodology X. "การต่อสู้ที่ยากขึ้นคุณต้องเป็นผู้เรียน Padawan ของฉัน!"

มีนักเก็ตแห่งปัญญาในวิธีการแบบว่องไว --- พวกมันจำนวนมาก --- แต่พวกมันมักจะหมอบอยู่ในมูลสัตว์มากจนฉันไม่สามารถต่อสู้กับกฏกติกาได้ รับบิตนี้จากหน้าการต่อสู้ของ Wikipedia :

จำนวนบทบาทถูกกำหนดในการต่อสู้ บทบาททั้งหมดแบ่งออกเป็นสองกลุ่มที่แตกต่างกัน - หมูและไก่ - ตามลักษณะของการมีส่วนร่วมในกระบวนการพัฒนา

จริงๆ? หมูและไก่คุณพูดว่า? ที่น่าสนใจ! อดใจรอไม่ไหวที่จะส่งเจ้านายคนนี้ ...


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

12
+1 ... ถูกต้องมันยากที่จะทำอย่างนั้น <เสียงที่ดังเฟื่องฟู> * ฉันเป็น SCRUMMASTER * </voice>
GrandmasterB

2
และคำอุปมา มันทำให้ผมนึกถึงคำเทศนาในโบสถ์หรือเรื่องราวเล็ก ๆ น้อย ๆ ที่ผู้เชี่ยวชาญด้านการช่วยเหลือตนเอง (และนักแสดงตลก) มีชื่อเสียงในเรื่อง: "พาเพื่อนของฉันสตีฟสตีฟเถียงกับ Sheryl ภรรยาของเขาตลอดเวลาทั้งสองคนจะไปที่นั่นเป็นเวลาหลายชั่วโมง จุดที่การแต่งงานของพวกเขาตกอยู่ในอันตรายจริง ๆ จากนั้นวันหนึ่ง ... "เส้นด้ายการสอนประเภทนี้ไม่ได้รบกวนฉันในวงอื่น ๆ แต่ฉันเกลียดที่จะเห็นพวกเขาแพร่หลายในวิทยาศาสตร์วิศวกรรม
evadeflow

2
สิ่งที่เกี่ยวกับการแย่งชิงนินจา
Berin Loritsch

1
ฉันไม่เห็นด้วยกับการเปรียบเทียบ "หมูและไก่" ... มันบินตรงไปที่ใบหน้าของประกาศเปรียว คือ "ความร่วมมือกับลูกค้าในการเจรจาต่อรองสัญญา" ลูกค้าจะได้รับสิทธิ (ถ้าไม่ใช่ moreso) ในความสำเร็จของโครงการในฐานะทีมงานโครงการ การเรียกหมูบทบาทและไก่บทบาทอื่น ๆ ตั้งความคิด "เรากับพวกเขา" ที่ IMHO เป็นสิ่งกีดขวางบนถนนที่ใหญ่ที่สุดในโครงการที่ประสบความสำเร็จ
Michael Brown

25

การทำแผนที่วัตถุสัมพันธ์ ... http://en.wikipedia.org/wiki/Object-relational_mapping

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


19
การเพิ่มประสิทธิภาพก่อนวัยอันควรเป็นรากฐานของความชั่วร้ายทั้งหมด รหัสที่ช้าในชีวิตจริงมีปัญหาเพียงน้อยนิดเมื่อเทียบกับรหัสที่ไม่สามารถรักษาได้ ใช้ ORM จากนั้นตัดสิ่งที่เป็นนามธรรมเฉพาะที่คุณต้องการ
Fishtoaster

28
ORM's เป็นเครื่องมือ 80-20 พวกเขาตั้งใจที่จะจัดการกับ CRUD 80% ที่กลายเป็นเรื่องที่น่าเบื่อหน่ายในการเขียนรหัสการประปาที่ไม่มีที่สิ้นสุดหลังจากสักครู่ อีก 20% สามารถทำได้ในรูปแบบ "ธรรมดา" มากกว่าเช่นการใช้โพรซีเดอร์ที่เก็บไว้และการเขียนเคียวรี SQL ทั่วไป
Robert Harvey

18
@ Fishtoaster: คุณไม่ได้หมายความว่า"เราควรลืมเกี่ยวกับประสิทธิภาพเล็กน้อยพูดถึง 97% ของเวลา: การเพิ่มประสิทธิภาพก่อนวัยอันควรเป็นรากเหง้าของความชั่วร้ายทั้งหมด
Robert Harvey

5
@ Robert Harcey: มีเหตุผลที่ฉันไม่ได้ใช้คำพูดโดยตรง ฉันคิดว่าโปรแกรมเมอร์ส่วนใหญ่มุ่งเน้นไปที่วิธีที่มีประสิทธิภาพมากเกินไป - มันเป็นปัญหาที่บางคนต้องการแก้ไข เป็นที่ยอมรับว่ามีบางโดเมนที่สำคัญกว่าโดเมนอื่น ๆ แต่การบำรุงรักษาและการขยายความสามารถเป็นปัญหาได้ทุกที่ ใบเสนอราคาดัดแปลงอื่น: "ทำให้ใช้งานได้ทำให้บำรุงรักษาทำให้อ่านได้ทำให้ขยายได้ทดสอบได้แล้วถ้าคุณมีเวลาและปรากฎว่าคุณต้องการให้รีบทำ"
Fishtoaster

12
@ Craig: คุณไม่รู้จักประชดในคำสั่งของคุณได้อย่างไร? ต้องการปีเพื่อเรียนรู้วิธีการรับประสิทธิภาพที่ดีจาก ORM เป็นอาร์กิวเมนต์ที่ยอดเยี่ยมกับ ORMs เช่นเดียวกับความต้องการ "ควบคุม" SQL ที่ผลิตและอัดฉีดกระบวนงานที่เก็บไว้ หากคุณมีความรู้สำหรับสิ่งนั้นคุณมีความรู้ในการเลี่ยง ORM ทั้งหมด
Nicholas Knight

22

การเขียนชื่อฟังก์ชั่นราวกับเป็นประโยคภาษาอังกฤษ:

Draw_Foo()
Write_Foo()
Create_Foo()

ฯลฯ สิ่งนี้อาจดูดี แต่มันก็เจ็บปวดเมื่อคุณเรียนรู้ API การค้นหาดัชนีสำหรับ "ทุกสิ่งที่ขึ้นต้นด้วย Foo" ง่ายขึ้นเพียงใด

Foo_Draw()
Foo_Write()
Foo_Create()

เป็นต้น


2
อาจเป็นเรื่องง่ายเหมือนพิมพ์ Foo ในรายการฟังก์ชันของ TM
Josh K

68
ดูเหมือนว่าคุณต้องการให้มันเป็นFoo.Draw()จริงFoo.Write()และFoo.Create()เพื่อให้คุณสามารถทำFoo.methods.sortหรือFoo.methods.grep([what I seek]).sort
Inaimathi

7
เริ่มต้นด้วย 'รับ' เป็นอีกตัวอย่างหนึ่ง
JeffO

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

2
@Scott Whitlock: ไม่ว่าจากวันที่สำหรับการพัฒนา NET บาง iirc, VS 2,008 ไม่ได้ทำ แม้ว่าจะเป็นปี 2010 และเป็นเรื่องที่ยอดเยี่ยมมาก
Steven Evers

22

MVC - ฉันมักจะพบว่าการขัดจังหวะปัญหาการออกแบบเว็บจำนวนมากในแนวทาง MVC นั้นเป็นเรื่องเกี่ยวกับการทำเฟรมเวิร์ก (rails และอื่น ๆ ) ให้มีความสุขมากกว่าความเรียบง่ายหรือโครงสร้าง MVC เป็นที่ชื่นชอบของ "นักบินอวกาศสถาปัตยกรรม" ที่ดูเหมือนจะให้ความสำคัญกับการนั่งร้านมากกว่าความเรียบง่าย YMMV

OO ระดับพื้นฐาน - ในความคิดของฉันสนับสนุนโครงสร้างที่ซับซ้อนของรัฐที่ไม่แน่นอน กรณีที่น่าสนใจเพียงอย่างเดียวที่ฉันได้พบสำหรับ OO ในชั้นเรียนในช่วงหลายปีที่ผ่านมาคือตัวอย่าง "รูปร่าง -> สี่เหลี่ยมผืนผ้า -> สี่เหลี่ยม" ที่ซ้ำซากซึ่งเป็นบทที่ 1 ของหนังสือ OO ใด ๆ


4
ฉันได้ทำการพัฒนาเว็บไซต์ใน ASP.NET และ ASP.NET MVC และแม้ว่า MVC ดูเหมือนจะเป็นโครงร่างฉันก็ชอบมันมากกว่า ASP.NET ด้วยเหตุผลหลายประการ: ความเรียบง่ายการบำรุงรักษาและการควบคุมมาร์คอัปที่ยอดเยี่ยม ทุกอย่างมีที่ของมันและในขณะที่มันดูเหมือนว่าจะซ้ำไปซ้ำมา แต่มันก็เป็นความสุขที่จะรักษา มันปรับแต่งได้อย่างสมบูรณ์ดังนั้นหากคุณไม่ชอบพฤติกรรมนอกกรอบคุณสามารถเปลี่ยนได้
Robert Harvey

1
เท่าที่ OO กังวลมีวิธีที่ดีและไม่ดีที่จะทำ การสืบทอดนั้นมีการพูดเกินจริงและใช้ในโลกแห่งความเป็นจริงมากกว่าที่หนังสือส่วนใหญ่เชื่อ ปัจจุบันมีแนวโน้มไปสู่รูปแบบการพัฒนาที่ใช้งานได้และไม่เปลี่ยนแปลงไม่ได้แม้กระทั่งในโลกของ OO
Robert Harvey

1
+1 สำหรับการกล่าวถึง MVC ในขณะที่แนวคิดของ MVC (การแยกตรรกะของเลเยอร์ข้อมูล, ตรรกะการนำเสนอและตรรกะพื้นหลังเป็นความคิดที่ดี) การแยกทางกายภาพเหล่านั้นออกเป็นลำดับชั้นของโฟลเดอร์ที่ซับซ้อนด้วยความผิดพลาดของไฟล์ที่มีตัวอย่างโค้ดคือโง่ ฉันตำหนิปรากฏการณ์ทั้งหมดนี้ในการสนับสนุน namespace ที่ไม่เพียงพอของ PHP และนักพัฒนามือใหม่ที่ยกย่องเทคนิคเก่าแก่หลายสิบปีว่าเป็น 'สิ่งใหม่ล่าสุด' ง่ายมากสร้างเนมสเปซสำหรับ accessors ฐานข้อมูล GUI และตรรกะพื้นหลัง (และ sub-namespaces ตามที่ต้องการ)
Evan Plaice

3
สำหรับ OO คุณจะไม่เห็นว่ามันมีประโยชน์จนกว่าโครงการของคุณจะเติบโตถึงขนาดที่การจัดการความซับซ้อนกลายเป็นเรื่องสำคัญ ปฏิบัติตามหลักการความรับผิดชอบเดียวทุกที่ที่เป็นไปได้และหากรหัสของคุณสามารถเข้าถึงได้เปิดเผยต่อสาธารณชน (เช่น. dll) ซ่อนการใช้งานภายในของคลาส / วิธีการ / คุณสมบัติเมื่อใดก็ตามที่เป็นไปได้เพื่อทำให้รหัสปลอดภัยยิ่งขึ้น
Evan Plaice

1
ฉันเองพบว่ารูปร่าง -> สี่เหลี่ยมผืนผ้า -> ตัวอย่างสแควร์เป็นหนึ่งในข้อโต้แย้งที่สง่างามที่สุดกับ oop ตัวอย่างเช่นการมันเพียงพอที่จะSquare(10).Draw() Rectangle(10, 10).Draw()ฉันเดาว่านั่นหมายความว่าจตุรัสเป็นคลาสย่อยของสี่เหลี่ยมผืนผ้า แต่mySquare.setWidthHeight(5,10)เป็นเรื่องไร้สาระ (IE มันล้มเหลวหลักการทดแทน Liskov) สี่เหลี่ยมจัตุรัสไม่สามารถมีความสูงและความกว้างที่แตกต่างกันได้แม้ว่าสี่เหลี่ยมผืนผ้าสามารถทำได้ สิ่งนี้เป็นที่รู้จักในบริบทอื่น ๆ เช่น "ปัญหาวงรีวงรี"
SingleNegationElimination

22

YAGNI

( คุณไม่ต้องการมัน )

วิธีนี้มีค่าใช้จ่ายฉันชั่วโมงและชั่วโมงเมื่อฉันต้องใช้คุณสมบัติใน codebase ที่มีอยู่ที่วางแผนอย่างรอบคอบจะได้รวมคุณสมบัติเหล่านี้ไว้ล่วงหน้า

ความคิดของฉันมักจะถูกปฏิเสธเพราะ YAGNI และส่วนใหญ่มีคนต้องจ่ายสำหรับการตัดสินใจในภายหลัง

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


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

12
P.Floyd, @Jason Baker: +1 ถูกต้อง การใช้คำพูดแบบเก่าที่นี่ "เดือนในห้องแล็บสามารถประหยัดเวลาในห้องสมุด"
Steven Evers

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

1
@TokenMacGuy สิ่งสำคัญคือนัยโดยส่วนspec นั่นคือสิ่งที่ความคิดเห็นต่างกันมาก
ฌอนแพทริคฟลอยด์

20

สำหรับ SQL

  1. อย่าใช้ทริกเกอร์
  2. ซ่อนตารางไว้หลังมุมมองเสมอ

ในการสั่งซื้อ:

  1. มันเป็นคุณสมบัติที่มีอยู่ คุณมีเส้นทางการอัปเดตหลายเส้นทางไปยังตารางหรือต้องการการตรวจสอบ 100% หรือไม่

  2. ทำไมล่ะ ฉันจะถ้าฉัน refactoring เพื่อรักษาสัญญา แต่ไม่เมื่อฉันอ่านว่าชาวบ้านเปลี่ยนมุมมองเพื่อให้ตรงกับการเปลี่ยนแปลงตารางใด ๆ

แก้ไข:

ข้อ 3: หลีกเลี่ยง * ด้วย EXISTS ลอง 1/0 มันได้ผล. รายการคอลัมน์ไม่ได้รับการประเมินตามมาตรฐาน SQL หน้า 191


3
# 2 เป็นแนวปฏิบัติที่ดีที่สุด
โฮแกน

2
@Hogan: ใช่มันเป็นเอกสารในหลายสถานที่vyaskn.tripod.com/sql_server_security_best_practices.htmและ flylib.com/books/en/3.404.1.34/1 และน้อยดังนั้นที่นี่: simple-talk.com/community/blogs/tony_davis/ ไฟล์เก็บถาวร /
2009/08/06

1
@Hogan: มุมมองที่ทำมิเรอร์ตารางพื้นฐานเพิ่มความปลอดภัยไม่มีการใช้ตารางฐานโดยตรง หากคุณเข้าร่วมกับตารางผู้รักษาความปลอดภัยหรือปิดบังบางคอลัมน์ก็ยุติธรรมพอ แต่เลือกทุกคอลัมน์จากตารางหรือมุมมอง: ไม่แตกต่างกัน ส่วนตัวแล้วฉันใช้ procs ที่จัดเก็บอยู่แล้ว
gbn

3
@ โฮแกน: ฉันรู้บางอย่างเกี่ยวกับ SQL Server :-) stackoverflow.com/users/27535/gbn สิ่งที่ฉันหมายถึง GRANT SELECT บนโต๊ะไม่ต่างกับ GRANT SELECT ON VIEW ถ้ามุมมองถูกเลือก * จากตาราง
gbn

1
@gbn: ฉันเห็นด้วย ไม่มีความแตกต่าง ฉันคิดว่าเราอาจจะพูดในสิ่งเดียวกัน ฉันเดาว่าความคิดเห็นดั้งเดิมของฉัน ("# 2 เป็นวิธีปฏิบัติที่ดีที่สุด?") มีพื้นฐานมาจากประสบการณ์ส่วนตัวของฉันที่การดู (เช่นทริกเกอร์) มักจะใช้บ่อยกว่าการใช้อย่างถูกต้อง ดังนั้นวิธีปฏิบัติที่ดีที่สุดเช่นนี้จะนำไปสู่การล่วงละเมิดเท่านั้น หากถือว่าเป็นแนวปฏิบัติที่ดีที่สุดคุณจะถูกต้อง 100% ถือว่าเป็นการปฏิบัติที่ไม่ดี
โฮแกน

20

รูปแบบการออกแบบส่วนใหญ่ มีการใช้เกินและต่ำกว่าที่ใช้


13
+1 ฉันยังไม่เห็นว่ารูปแบบการออกแบบนั้นมีความสวยงามหรือโซลูชั่นที่สง่างามอย่างไร พวกเขาแก้ปัญหาข้อบกพร่องทางภาษาไม่มีอะไรเพิ่มเติม
Oliver Weiler

2
แค่เห็นว่ามันเป็นความพยายามในการกำจัดกลิ่นภาษาโดยใช้ภาษานั้นเอง
Filip Dupanović

15

หลักการความรับผิดชอบเดี่ยว

("ทุกชั้นควรมีความรับผิดชอบเพียงอย่างเดียว; ในคำอื่น ๆ ทุกชั้นควรมีหนึ่งและเหตุผลเดียวเท่านั้นที่จะเปลี่ยน")

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

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

ลองนึกภาพถ้าผู้สร้าง. Net API มีความคิดเช่นนี้: แทนที่จะเป็น List.Sort (), List.Reverse (), List.Find () เป็นต้นเรามีคลาส ListSorter, ListReverser และ ListSearcher!

แทนที่จะเถียงกับ SRP อีกต่อไป(ซึ่งตัวมันเองก็ไม่ได้เลวร้ายในทางทฤษฎี)ฉันจะแบ่งปันประสบการณ์เล็ก ๆ น้อย ๆ ของฉันเกี่ยวกับประสบการณ์อันยาวนาน:


ในที่แห่งหนึ่งที่ฉันทำงานฉันเขียนตัวแก้ปัญหาการไหลอย่างง่าย ๆซึ่งประกอบด้วยห้าคลาส: โหนด, กราฟ, ผู้สร้างกราฟ, ผู้แก้กราฟและชั้นเรียนเพื่อใช้ผู้สร้างกราฟ / นักแก้ปัญหาเพื่อแก้ ปัญหาโลกแห่งความจริง ไม่มีความซับซ้อนหรือความยาวเป็นพิเศษ (ตัวแก้ปัญหานั้นยาวที่สุดที่ ~ 150 บรรทัด) อย่างไรก็ตามมีการตัดสินใจว่าชั้นเรียนมี "ความรับผิดชอบ" มากเกินไปดังนั้นเพื่อนร่วมงานของฉันจึงกำหนดให้มีการสร้างรหัสใหม่ เมื่อพวกเขาทำเสร็จแล้ว 5 ชั้นเรียนของฉันได้รับการขยายเป็น 25 ชั้นซึ่งบรรทัดของรหัสทั้งหมดมากกว่าสามเท่าที่พวกเขาเดิม การไหลของรหัสไม่ชัดเจนอีกต่อไปและไม่มีจุดประสงค์ของการทดสอบหน่วยใหม่ ตอนนี้ฉันมีเวลายากที่จะหาสิ่งที่รหัสของตัวเองทำ


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


ที่อื่น (ซึ่งมีคลาสความคิดที่ควรมีเพียงวิธีเดียวเท่านั้น ) เรากำลังพยายามปรับวิธีที่เหมาะสมซึ่งใช้เวลา 95% ของเวลาในระหว่างการดำเนินการบางอย่าง หลังจาก (ค่อนข้างโง่) ปรับให้เหมาะสมเล็กน้อยฉันหันความสนใจของฉันไปทำไมมันถูกเรียกว่าเป็นพันล้านครั้ง มันถูกเรียกในลูปในคลาส ... ซึ่งวิธีการถูกเรียกในลูปในคลาสอื่น .. ซึ่งก็ถูกเรียกในลูป ..

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

คำขอของฉันในการปรับโครงสร้าง 13 คลาสเหล่านั้นเป็นคลาสเดียวถูกปฏิเสธ


6
ดูเหมือนว่าใครบางคนจะมี "Pattern Fever" หรือในกรณีนี้ "Principle Fever" ในงานนั้น คลาสรายการไม่ละเมิด SRP ฟังก์ชั่นทั้งหมดของมันมีจุดประสงค์เดียวคือจัดการกับชุดของวัตถุ การมีฟังก์ชั่นเดียวในชั้นเรียนฟังดูเหมือนเกินความจริงสำหรับฉัน หลักการที่อยู่เบื้องหลัง SRP คือหน่วยของรหัส (ไม่ว่าจะเป็นวิธีการเรียนหรือห้องสมุด) ควรมีความรับผิดชอบเดียวที่สามารถระบุได้สำเร็จ
Michael Brown

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

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

"ลองคิดดูว่าผู้สร้าง. Net API มีความคิดแบบนี้: แทนที่จะเป็น List.Sort (), List.Reverse (), List.Find () เป็นต้นเราจะมีคลาส ListSorter, ListReverser และ ListSearcher !" ตรงนี้เป็นสิ่งที่ทำใน C ++ และมันวิเศษมาก อัลกอริทึมจะถูกแยกออกจากโครงสร้างข้อมูลดังนั้นถ้าฉันเขียนคอนเทนเนอร์ของตัวเองอัลกอริทึมทั้งหมดที่ทำงานกับไลบรารีมาตรฐานเพิ่งทำงานกับคอนเทนเนอร์ใหม่ของฉัน มันจะต้องน่ากลัวในดินแดน. Net เขียนฟังก์ชั่นการเรียงลำดับใหม่สำหรับทุกคอนเทนเนอร์ใหม่ที่คุณต้องการเรียงลำดับ
Mankarse

14

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

นอกจากนี้การเปลี่ยนสิ่งประถมง่าย ๆ เช่น

0 == memberArray.length

ภายในคลาสที่มีการเรียกไปยังวิธีการของคลาสเช่น

isEmpty()

เป็น "การปรับปรุง" IMHO ที่น่าสงสัย เพิ่มเติม:ความแตกต่างคือการตรวจสอบครั้งแรกทำสิ่งที่มันบอกว่า: ตรวจสอบว่าความยาวของอาร์เรย์เป็น 0 ตกลงisEmpty()อาจตรวจสอบความยาวของอาร์เรย์ด้วย แต่มันสามารถนำไปใช้เช่นนี้:

return null != memberArray ? 0 == memberArray.length : true;

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


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

ฉันจะไปไกลถึงจะบอกว่าในบางกรณีวิธี 1 บรรทัดสั้นเกินไปที่จะสมควรได้รับวิธีการ


6
ฉันไม่ค่อยเห็นสิ่งนี้เป็นปัญหา ส่วนใหญ่เป็นเพราะฉันมักจะเห็นมากเกินไปในวิธีการเดียวไม่น้อยเกินไป อย่างไรก็ตามตามการศึกษาบางอย่างความซับซ้อนที่ต่ำมากในวิธีการยังมีอัตราข้อผิดพลาดที่สูงขึ้นเล็กน้อยกว่าความซับซ้อนในระดับปานกลางต่ำ enerjy.com/blog/?p=198
MIA

ใช่นี่เป็นปัญหาใน Clean Code เท่านั้น ในวิธีการในชีวิตจริงมักจะยาวเกินไปดังที่คุณพูด แต่มันน่าสนใจที่จะเห็นโค้งนั้น! แท้จริงแล้วสิ่งต่าง ๆ ควรทำอย่างง่ายที่สุดเท่าที่จะทำได้ แต่ไม่ง่ายกว่านี้
Joonas Pulakka

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

@ Robert Harvey: ตัวอย่างที่สองเป็นวิธีสาธารณะที่ดี แต่การเรียกมันจากภายในคลาสนั้นเป็นสิ่งที่น่าสงสัยเพราะคุณไม่รู้ว่ามันทำอะไรก่อนที่คุณจะมองว่ามันถูกนำไปใช้อย่างไร มันสามารถตรวจสอบค่าว่างตัวอย่างเช่น ดูการเพิ่มของฉันด้านบน
Joonas Pulakka

@ Joonas: ยุติธรรมเพียงพอ
Robert Harvey

13

"เป็นคนใจกว้างกับความคิดเห็น"

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


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

6
ฉันต้องเห็นด้วยกับวิธีที่ sova ใส่อันนี้ รหัสสะอาดดีกว่าความคิดเห็น
riwalk

4
คุณยังต้องการ "ทำไม" ในนั้น!

ฉันควรมีความคิดเห็นอธิบายว่าทำไม มันหมายความว่าฉันต้องคิดน้อยลงในการทำวิศวกรรมย้อนกลับเจตนาของรหัสเมื่อฉันมาดูมัน
quick_now

12

GoTo ถือว่าเป็นอันตราย

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

"แนวปฏิบัติที่ดีที่สุด" ใด ๆ ที่ไม่อนุญาตให้มีข้อยกเว้นที่สมเหตุสมผลและมีเอกสารประกอบของกฎนั้นเป็นเพียงเรื่องธรรมดาที่น่ากลัว


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

3
@Mathieu M. - ตกลง - ผสม GOTO กับข้อความสั่งการควบคุมแบบมีโครงสร้างไม่สมเหตุสมผล (นี่คือ C บริสุทธิ์และมันก็ไม่เป็นปัญหา
MZB

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

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

3
การใช้ยาสเตมมาซีนโดยตรงอาจเป็นปฏิปักษ์ มีหลายวิธีในการมีเครื่องสถานะโดยไม่แสดงสถานะและ transiitions อย่างแท้จริง ตัวอย่างเช่นimport re
SingleNegationElimination

12

การเสียสละที่เราทำเพื่อให้สามารถทดสอบโค้ดได้

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

  • การสร้างส่วนต่อประสานสำหรับทุกชั้นเรียน วิธีนี้จะเพิ่มจำนวนคลาส (ไฟล์) ที่จะจัดการและเพิ่มรหัสซ้ำ ใช่การเขียนโปรแกรมอินเทอร์เฟซดี แต่นั่นคือสิ่งที่ตัวระบุสาธารณะ / ส่วนตัวมีความหมายสำหรับ
  • ทุกคลาสที่ไม่ได้สร้างอินสแตนซ์เมื่อเริ่มต้นจำเป็นต้องมีโรงงาน เห็นได้ชัดว่าnew MyClass()ง่ายกว่าการเขียนโรงงาน แต่ตอนนี้วิธีการที่สร้างมันไม่สามารถทดสอบแยกได้ ถ้าไม่ใช่เพราะเรื่องนี้ฉันจะทำเพียง 1 ใน 20 ของจำนวนคลาสโรงงานที่ฉันทำตอนนี้
  • ทำให้ทุกคลาสเป็นแบบสาธารณะซึ่งเอาชนะจุดประสงค์ของการมีตัวระบุการเข้าถึงบนคลาสเลย อย่างไรก็ตามคลาสที่ไม่ใช่แบบสาธารณะไม่สามารถเข้าถึงได้ (และผ่านการทดสอบ) จากโครงการอื่น ๆ ดังนั้นตัวเลือกอื่นเท่านั้นที่จะย้ายรหัสการทดสอบทั้งหมดไปยังโครงการเดียวกัน (และปล่อยด้วยผลิตภัณฑ์สุดท้าย)
  • ฉีดพึ่งพา เห็นได้ชัดว่าการให้คลาสอื่น ๆทุกครั้งที่ฉันใช้ฟิลด์และคอนสตรัคเตอร์พารามิเตอร์นั้นทำงานได้ดีกว่าการสร้างเมื่อฉันต้องการ แต่จากนั้นฉันไม่สามารถทดสอบชั้นนี้ได้อีกต่อไป
  • หลักการความรับผิดชอบเดี่ยวซึ่งได้ทำให้ผมปวดหัวมากดังนั้นฉันได้ย้ายไปของคำตอบของตัวเอง

แล้วเราจะทำอย่างไรเพื่อแก้ไขปัญหานี้? เราต้องการการเปลี่ยนแปลงอย่างมากในสถาปัตยกรรมภาษา:

  • เราต้องการความสามารถในการเลียนแบบคลาส
  • เราจะต้องมีความสามารถในการทดสอบวิธีการส่วนตัวของชั้นเรียนภายในจากโครงการอื่น(อาจจะดูเหมือนเป็นช่องโหว่ความปลอดภัย แต่ฉันไม่เห็นมีปัญหาถ้า testee ถูกบังคับให้ต้องทดสอบชื่อชั้นเรียนของมัน)
  • การฉีดพึ่งพา (หรือสถานที่ให้บริการ) เช่นเดียวกับสิ่งที่เทียบเท่ากับรูปแบบโรงงานที่มีอยู่ของเราจะต้องเป็นส่วนหลักของภาษา

ในระยะสั้นเราต้องใช้ภาษาที่ออกแบบมาจากพื้นดินขึ้นกับการตรวจสอบในใจ


ฉันคาดเดาว่าคุณไม่เคยได้ยินTypeMockใช่ไหม จะอนุญาตให้เรียนเยาะเย้ย, เอกชน, สถิตยศาสตร์ (โรงงาน) อะไร
Allon Guralnek

@ Allon: ฉันมี แต่มันอยู่ไกลจากฟรีทำให้มันไม่ใช่ตัวเลือกสำหรับคนส่วนใหญ่
BlueRaja - Danny Pflughoeft

หากคุณต้องเขียนคลาสของโรงงานจำนวนมากแสดงว่าคุณทำอะไรผิดไป ไลบรารี Smart DI (เช่น Autofac สำหรับ C #) สามารถใช้ Func <T>, Lazy <T>, Delegates และอื่น ๆ สำหรับโรงงานโดยไม่ต้องเขียนด้วยตนเองใด ๆ
gix

10

การแยกแอปพลิเคชันออกเป็น Tiers; ชั้นข้อมูล, ชั้นธุรกิจ, ชั้น UI

เหตุผลหลักที่ฉันไม่ชอบสิ่งนี้คือสถานที่ส่วนใหญ่ที่ใช้วิธีการนี้ใช้กรอบที่เปราะบางมากในการทำให้เสร็จ IE UI Layer นั้นเขียนด้วยมือเพื่อจัดการกับวัตถุเลเยอร์ธุรกิจวัตถุเลเยอร์ธุรกิจนั้นเขียนด้วยมือเพื่อจัดการกับกฎเกณฑ์ทางธุรกิจและฐานข้อมูลฐานข้อมูลคือ SQL และค่อนข้างเปราะบางและจัดการโดยกลุ่ม "DBA" ที่ไม่ชอบการเปลี่ยนแปลง

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

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

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

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

ฉันอาจจะได้รับการกระแทกสำหรับเรื่องนี้ แต่มี :)


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

... ต่อไปร้านค้าส่วนใหญ่ล้มเหลวอย่างมากในการรู้จักตรรกะของ UI หรือตรรกะการนำเสนอ เนื่องจากพวกเขาไม่เข้าใจว่าตรรกะทางธุรกิจมีอยู่เพียงเล็กน้อยในแอปพลิเคชัน CRUD ทั่วไปพวกเขารู้สึกว่าพวกเขาต้องทำอะไรผิดเมื่อตรรกะส่วนใหญ่อยู่ในเลเยอร์การนำเสนอเป็นตรรกะการนำเสนอ มันได้รับการระบุอย่างผิด ๆ ว่าเป็นตรรกะทางธุรกิจและจากนั้นผู้คนก็ผลักดันมันไปยังเซิร์ฟเวอร์เพื่อเรียกเซิร์ฟเวอร์อีกครั้ง Thin Client สามารถและควรมีตรรกะของงานนำเสนอเช่น (ซ่อน textField2 หากมีการเลือกตัวเลือก 1 ใน dropDown3)
maple_shaft


7

เรื่องราวของผู้ใช้ / กรณีใช้งาน / บุคคล

 

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


7

80 ขีด จำกัด ถ่าน / บรรทัดโง่

ฉันเข้าใจว่าต้องมีการประนีประนอมเพื่อให้สอดคล้องกับจังหวะของนักวิ่งที่ช้าที่สุดในฝั่ง GUI (ข้อ จำกัด ด้านความละเอียดหน้าจอ ฯลฯ ) แต่ทำไมกฎนั้นจึงใช้กับการจัดรูปแบบโค้ด?

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

แน่นอนว่ามีบรรณาธิการของ CLI ที่ใช้ * nix ไดโนเสาร์อย่างเคร่งครัดซึ่งปฏิบัติตามข้อ จำกัด เก่า ๆ ที่เหนื่อยล้าของเทอร์มินัล VT220 ของพวกเขา แต่ทำไมพวกเราที่เหลืออยู่ถึงมาตรฐานเดียวกัน?

ฉันพูดว่าขันขีด จำกัด ถ่าน 80 ตัว หากไดโนเสาร์มีความกล้าพอที่จะแฮ็ก emacs / vim ได้ตลอดทั้งวันทำไมไม่สามารถสร้างส่วนขยายที่ล้อมเส้นโดยอัตโนมัติหรือให้ความสามารถในการเลื่อนแนวนอนกับ CLI IDE ของพวกเขา

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

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

แก้ไข:

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

เมื่อจอภาพคอมพิวเตอร์ 800x600 กลายเป็นบรรทัดฐานสำหรับผู้ใช้ส่วนใหญ่นักพัฒนาเว็บได้เพิ่มความกว้างของเว็บไซต์เพื่อรองรับส่วนใหญ่ ... ทำไมนักพัฒนาไม่สามารถทำเช่นเดียวกัน


1
@Orbling ตรรกะ GWB ที่ดีด้วย ___ คือมุมที่ชั่วร้าย ดังนั้นคุณเกลียด hScroll คุณมีเหตุผลที่ถูกต้องทำไม col-width ควร จำกัด 80 ตัวอักษร? ทำไมไม่ 160 หรือ 256 ฉันคิดว่าเราทุกคนสามารถสันนิษฐานได้ว่านักพัฒนาส่วนใหญ่ถอนการติดตั้งเทอร์มินัล VT220 และแทนที่พวกเขาด้วย puTTY ดังนั้นพวกเขาจึงสามารถขยายความกว้างโดยทางโปรแกรมได้
Evan Plaice

4
ฉันชอบที่เรายึดติดกับขีด จำกัด ถ่าน 80 ทันทีที่คุณให้พื้นที่แนวนอนมากขึ้นฉันจะพยายามเปิดเอกสารเพิ่มเติมพร้อมกับที่เหลือ ฉันเกลียดที่จะต้องเลื่อนสี่วิธี นอกจากนี้ฉันยังสังเกตเห็นบ่อยครั้งว่าฉันกำลังบังคับให้เขียนโค้ดที่อ่านได้มากขึ้นด้วย 80 char cap
Filip Dupanović

2
คุณจะพิมพ์มันอย่างไร

5
ขออภัย - ไม่เห็นด้วยกับสิ่งนี้ ฉันเกลียดเส้นยาวที่ยาวมาก ๆ - มันต้องมีการเคลื่อนไหวของดวงตามากขึ้น, มันต้องใช้ท่าทางของเมาส์เพื่อเลื่อนข้าม, มันยากที่จะเห็นสิ่งที่มีค่าเล็กน้อยห้อยลงมาจนสุดบรรทัด ในประมาณ 99% ของกรณีมีวิธีการที่สะอาดในการทำสิ่งต่าง ๆ ผ่านหลาย ๆ บรรทัด (สั้นกว่า) ซึ่งชัดเจนและอ่านง่ายกว่า 80 Chars อาจเป็นกฎเกณฑ์และ "เพราะเป็นเช่นนั้นในสมัยของบัตรเจาะ" แต่ก็ยังมีกรอบการทำงานที่สมเหตุสมผลในการทำงานภายในเวลาส่วนใหญ่ - ด้วยเหตุผลข้างต้น
quick_now

3
เยื้อง 2 ช่องว่าง และใช้เครื่องมือแก้ไขพร้อมกับตัวติดตามการเยื้องอัตโนมัติ ฉันทำแบบนั้นมาหลายปีแล้วไม่ใช่เรื่องใหญ่อะไร (Emacs ที่มีโหมดที่เหมาะสมช่วยได้ที่นี่)
fast_now

5

วัด, วัด, วัด

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

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


5

ครูของฉันความต้องการที่จะเริ่มต้นตัวบ่งชี้ของฉันทั้งหมด (ไม่รวมค่าคงที่) myVariableที่มีตัวอักษรตัวพิมพ์เล็กเช่น

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


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

@xnine ฉันมีตัวแทนไม่เพียงพอในไซต์นี้เพื่อให้คะแนนความคิดเห็นของคุณดังนั้นฉันจะตอบกลับพร้อมความคิดเห็นการอนุมัตินี้
Maxpm

5
กรณี Camel (ตัวอักษรตัวพิมพ์เล็กตัวแรก) เป็นแบบแผนที่ใช้กันทั่วไปเช่นเดียวกับตัวอักษร Pascal (ตัวอักษรตัวแรกของทุกคำที่เป็นตัวพิมพ์ใหญ่) ในภาษาส่วนใหญ่จะใช้ camelCase กับตัวแปรส่วนตัว / ภายในที่ใช้ PascalCase กับคลาส, เมธอด, คุณสมบัติ, เนมสเปซ, ตัวแปรสาธารณะ ไม่ใช่วิธีที่ดีที่จะคุ้นเคยเพื่อเตรียมพร้อมสำหรับโครงการที่อาจใช้รูปแบบการตั้งชื่ออื่น
Evan Plaice

2
เพียงแค่ FYI บางภาษาอนุมานความหมายว่าอักษรตัวแรกของตัวแปรเป็นตัวพิมพ์ใหญ่หรือไม่ ในหนึ่งภาษาดังกล่าวหากอักษรตัวแรกเป็นตัวพิมพ์ใหญ่ตัวแปรจะถือว่าเป็นค่าคงที่ - ความพยายามใด ๆ ที่จะเปลี่ยนมันจะทำให้เกิดข้อผิดพลาด
Berin Loritsch

1
ในGoวิธีสาธารณะและสมาชิกในคลาสเริ่มต้นด้วยตัวอักษรตัวพิมพ์ใหญ่ ส่วนตัวที่มีอักษรตัวพิมพ์เล็ก
Jonathan Leffler

5

ใช้ Singletons

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


2
นั่นเป็นจำนวนเชิงลบทั้งหมดที่ทำให้ฉันค่อนข้างสับสนกับท่าทางที่แท้จริงของคุณในซิงเกิล
Paul Butcher

1
@Paul Butcher: ฉันเกลียดซิงเกิลและไม่ควรใช้

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

6
ใครบอกว่าการใช้ Singeltons เป็นแนวปฏิบัติที่ดีที่สุด
Phil Mander

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

5

ใช้ int เป็น iterator ที่ไม่ได้ลงชื่อ

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


ตกลงตอนนี้ฉันอยากรู้อยากเห็น - ทำไมคุณถึงพูดอย่างนั้น? ฉันรู้สึกว่าโง่เล็กน้อย - คุณสามารถให้ตัวอย่างโค้ดเพื่อสำรองงบของคุณได้ไหม
พอลนาธาน

4
@ พอลนาธาน: เท่าที่ buggyness ไปนี่เป็นตัวอย่าง: สำหรับ (int ที่ไม่ได้ลงชื่อ i = 0; i <10; i ++) {int crash_here = my_array [สูงสุด (i-1,0)];}
AareP

@AareP: เพื่อให้แน่ใจ - ฉันคิดว่าคุณอ้างถึงความจริงที่ว่าเมื่อ int ที่ไม่ได้ลงนาม0นั้นลดลง1คุณจะต้องจบลงด้วยค่าบวกสูงสุดที่ int ที่ไม่ได้ลงชื่ออาจเก็บไว้?
Adam Paynter

1
@Adam Paynter: ใช่ นี่อาจดูเป็นเรื่องปกติสำหรับโปรแกรมเมอร์ c ++ แต่มาดูกันว่า "int ที่ไม่ได้ลงนาม" คือ "การนำไปใช้" ที่ไม่ดีอย่างหนึ่งของตัวเลขบวกเท่านั้น
AareP

ไม่ใช่ความคิดที่ดีสำหรับเครื่องฝังตัวเล็ก ๆ - int ที่ไม่ได้ลงชื่อบ่อย ๆ จะสร้างรหัสที่เล็กลงและเร็วขึ้น ขึ้นอยู่กับคอมไพเลอร์และโปรเซสเซอร์
quick_now

4

วิธีการไม่ควรยาวเกินหน้าจอเดียว

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

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

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

นี่คือกฎของฉัน ...

เขียนฟังก์ชั่น / วิธีการเพื่อให้บรรลุบางสิ่งบางอย่าง

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

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

ฉันดูจากมุมมอง API dev ... หากผู้ใช้รายใหม่ดูที่คลาสไดอะแกรมของรหัสของคุณว่าส่วนใดของแผนผังนั้นจะสมเหตุสมผลในโครงการทั้งหมดที่มีขนาดใหญ่ขึ้น ผู้ช่วยเหลือไปยังส่วนอื่น ๆ ภายในโครงการ

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

จำกัด abstractions ที่ไม่จำเป็นและไม่สร้างมลภาวะให้กับการเติมข้อความอัตโนมัติ


นี้. ฉันเคยปรับเปลี่ยนฟังก์ชั่นยาว ๆ เป็นหลาย ๆ ครั้งเพื่อที่จะตระหนักว่าเกือบทั้งหมดต้องการพารามิเตอร์เกือบทั้งหมดของรหัสต้นฉบับ การจัดการพารามิเตอร์เป็นความเจ็บปวดที่ง่ายกว่าที่จะกลับไปใช้รหัสเดิม
l0b0

3
ฉันคิดว่าข้อโต้แย้งหนึ่งข้อในเรื่องนี้คือการเปลี่ยนส่วนของวิธีการที่มีขนาดใหญ่เป็นการโทรแยกต่างหากจะทำให้วิธีการอ่านง่ายขึ้น แม้ว่าวิธีการจะถูกเรียกเพียงครั้งเดียว
Jeremy Heiler

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

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

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