คุณจะจัดการกับความเข้าใจที่เป็นนามธรรมในรหัสได้อย่างไร


15

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

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

มีกลยุทธ์ที่ดีกว่าสำหรับการรับมือกับสถานการณ์นี้หรือไม่?

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



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

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

คำตอบ:


31

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

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

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

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

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

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

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

เห็นได้ชัดว่าฉันไม่ได้อยู่คนเดียวเมื่อต้องทำงานในลักษณะนี้:

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

Michael Feathers - รหัสส้ม


12

ที่ด้านล่างมีการอัปเดตบางอย่างเกี่ยวกับวิธีนี้ฉันได้รับทุกไตรมาสของปีหรือดังนั้นฉันคิดว่าพวกเขามีค่า

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

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

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


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

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

แล้วคุณจะทำอย่างไร

อธิบายรหัสของคุณกับเพื่อนร่วมงานและถามพวกเขาว่ามันสมเหตุสมผลหรือไม่จากมุมมองระดับสูง

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

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

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

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

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

เวลาในการประสบความสำเร็จที่เพิ่งเริ่มต้น

จัดสรรเวลาและทรัพยากรของคุณอย่างมีความหมายโลภ


นี่คือการแก้ไข 6 เดือนต่อมา:

มันเป็นการเดินทางที่บ้า ฉันไม่เคยคิดเลยว่าเพียงแค่การแยก / การตั้งชื่อที่ดีและเอกสารสามารถช่วยให้คุณสามารถเสียบอะไรก็ได้ใน & นอก codebase ของคุณ ฉันต้องเขียนโค้ดใหม่อีกครั้งเพื่อให้เร็วขึ้นด้วยการเปลี่ยนแปลงใหม่และฉันก็ทำได้ดีใน 2-3 วัน ฉันสามารถพูดได้อย่างปลอดภัยว่าฉันไม่ได้ติดตาม SOLID ทุกที่เนื่องจากขาดความรู้หรือแนวปฏิบัติที่ดีที่สุดและฉันสามารถบอกได้ว่าพวกเขามีหนี้สินทางเทคนิค แต่ไม่ใช่มาก แยกชื่อดี & เอกสารมันจะช่วยให้คุณสามารถเปลี่ยนรหัสได้ในเวลาไม่นานเมื่อคุณรู้ว่าคุณเป็นใบ้ได้อย่างไร

อย่าเข้าใจฉันผิด: ถ้าคุณเขียนโค้ดของคุณอย่างแน่นหนาคุณจะเจ็บปวดมากไม่ว่าคุณจะเกลียด SOLID หรือแม้แต่การทำความเข้าใจและการใช้มันในระดับฐานช่วยให้สามารถแยกแยะได้ดีซึ่งโดยสุจริตคือ สิ่งเดียวที่ OOP ช่วยได้จริงๆ OOP นั้นควรจะเกี่ยวกับการนำโค้ดกลับมาใช้ใหม่และในขณะที่เกิดขึ้นที่นี่และที่นั่นคุณจะไม่ได้รับประโยชน์จากวัตถุที่คุณสร้างอีกมากดังนั้นให้มุ่งเน้นไปที่การทำให้ระบบของคุณแยกจากกัน เมื่อคุณครบกำหนดและสมมติว่าลุงบ๊อบมาและเป็นผู้นำโครงการของคุณเขาจะพูดว่า "โอเคนี่มันโง่เหมือนนรก แต่อย่างน้อยทุกอย่างก็แยกกันมีชื่อ & บันทึกไว้อย่างน้อยฉันก็รู้ว่านี่คืออะไรเกี่ยวกับ " (ฉันหวังว่า). สำหรับฉันมันใช้งานได้ LOC ของฉันมีการเปลี่ยนแปลงอยู่ตลอดเวลา แต่ในขณะที่เขียนมันคือโค้ด 110k บรรทัดโค้ดประสิทธิภาพ 110k ที่ทำงานได้อย่างกลมกลืนสำหรับคนเพียงคนเดียว


นี่คือการแก้ไข 3 เดือนต่อมาในรหัส 8 เดือนฉันจะทำการเปลี่ยนโครงสร้าง:

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


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