#regions มี Antipattern หรือกลิ่นรหัสหรือไม่


264

C # ช่วยให้การใช้#region/ #endregionคำหลักเพื่อให้พื้นที่ของรหัสพับในการแก้ไข เมื่อใดก็ตามที่ฉันทำสิ่งนี้แม้ว่าฉันจะทำมันเพื่อซ่อนโค้ดขนาดใหญ่ที่อาจได้รับการ refactored เป็นคลาสหรือวิธีการอื่น ตัวอย่างเช่นฉันได้เห็นวิธีการที่มีรหัส 500 บรรทัดที่มี 3 หรือ 4 ภูมิภาคเพื่อให้สามารถจัดการได้

การใช้พื้นที่อย่างรอบคอบเป็นสัญญาณของปัญหาหรือไม่? ดูเหมือนว่าจะเป็นเช่นนั้นกับฉัน


9
FYI: CodeMap ช่วยลดความต้องการในภูมิภาคได้เป็นอย่างดี visualstudiogallery.msdn.microsoft.com/ - คลิกและจะนำคุณไปยังวิธีการ / คุณสมบัติ / สิ่งที่ ฉันใช้มันทุกวันและมันวิเศษมากที่คุณได้รับผลผลิตและในแง่ความรู้ความเข้าใจเช่นกัน คุณจะได้รับ 'มุมมองตานก' ที่ชัดเจนยิ่งขึ้นของชั้นเรียน

7
ใครสามารถสร้างวิกินี้ได้หรือไม่ ไม่มีคำตอบที่ถูกหรือผิดสำหรับคำถามนี้ (ดีด้วยเหตุผล) มันเป็นเรื่องส่วนตัวเกือบทั้งหมด
Ed S.

6
สำหรับสิ่งที่คุ้มค่า, เจฟฟ์แอดเกลียดพวกเขา เขาระบุว่าพวกเขาซ่อนรหัสที่ไม่ดี
Brian

3
Code ดมกลิ่นเป็นนักพัฒนาที่ไม่อาบน้ำและไม่ใช้ยาดับกลิ่น!
marko

5
ภูมิภาคที่สร้างขึ้นอย่างระมัดระวังในรหัสที่เหม็นคือสิ่งที่บีบสองสามของ Febreeze ทำบนโซฟาดื้อ มันทำให้สามารถรับภาระได้จนกว่าคุณจะพบเงิน (เวลา) เพื่อแทนที่
Newtopian

คำตอบ:


284

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

ตั้งแต่:

anti-pattern (หรือ antipattern) เป็นรูปแบบที่ใช้ในการดำเนินงานทางสังคมหรือธุรกิจหรือวิศวกรรมซอฟต์แวร์ที่อาจใช้กันทั่วไป แต่ไม่มีประสิทธิภาพและ / หรือต่อต้านการปฏิบัติในทางปฏิบัติ

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

อย่าใช้ภูมิภาคภายในวิธีการ refactor แทน

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

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

การใช้พื้นที่ในกรณีนี้อาจทำให้การปรับโครงสร้างทำได้ยากขึ้น ลองนึกภาพคุณมี:

private void DoSomething()
{
    var data = LoadData();
    #region Work with database
    var verification = VerifySomething();
    if (!verification)
    {
        throw new DataCorruptedException();
    }

    Do(data);
    DoSomethingElse(data);
    #endregion

    #region Audit
    var auditEngine = InitializeAuditEngine();
    auditEngine.Submit(data);
    #endregion
}

การยุบขอบเขตแรกเพื่อมุ่งเน้นที่สองไม่เพียง แต่มีความเสี่ยง: เราสามารถลืมเกี่ยวกับข้อยกเว้นในการหยุดการไหลได้อย่างง่ายดาย (อาจมีส่วนคำสั่งป้องกันพร้อมreturnแทน ถ้ารหัสควรจะ refactored ด้วยวิธีนี้:

private void DoSomething()
{
    var data = LoadData();
    #region Work with database
    var verification = VerifySomething();
    var info = DoSomethingElse(data);

    if (verification)
    {
        Do(data);
    }

    #endregion

    #region Audit
    var auditEngine = InitializeAuditEngine(info);
    auditEngine.Submit(
        verification ? new AcceptedDataAudit(data) : new CorruptedDataAudit(data));
    #endregion
}

ตอนนี้ภูมิภาคไม่มีเหตุผลและคุณไม่สามารถอ่านและเข้าใจรหัสในภูมิภาคที่สองได้โดยไม่ต้องดูรหัสในภาคแรก

อีกกรณีหนึ่งที่ฉันเห็นคือกรณีนี้:

public void DoSomething(string a, int b)
{
    #region Validation of arguments
    if (a == null)
    {
        throw new ArgumentNullException("a");
    }

    if (b <= 0)
    {
        throw new ArgumentOutOfScopeException("b", ...);
    }
    #endregion

    #region Do real work
    ...
    #endregion
}

มันเป็นเรื่องดึงดูดที่จะใช้พื้นที่เมื่อการตรวจสอบข้อขัดแย้งเริ่มขยาย LOC เป็นสิบ แต่มีวิธีที่ดีกว่าในการแก้ปัญหานี้: แหล่งที่ใช้โดยซอร์สโค้ด. NET Framework:

public void DoSomething(string a, int b)
{
    if (a == null)
    {
        throw new ArgumentNullException("a");
    }

    if (b <= 0)
    {
        throw new ArgumentOutOfScopeException("b", ...);
    }

    InternalDoSomething(a, b);
}

private void InternalDoSomething(string a, int b)
{
    ...
}

อย่าใช้ภูมิภาคนอกวิธีการจัดกลุ่ม

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

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

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

มีการใช้ที่ดีสำหรับภูมิภาคหรือไม่?

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

gotoคิดเกี่ยวกับมันเป็นเรื่องเกี่ยวกับ ความจริงที่ว่าภาษาหรือ IDE รองรับคุณสมบัติไม่ได้หมายความว่าควรใช้ทุกวัน กฎ StyleCop SA1124 ชัดเจน: คุณไม่ควรใช้ภูมิภาค ไม่เคย

ตัวอย่าง

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

สัตว์ประหลาด 4,000 LOC:

ฉันเพิ่งอ่านบางที่ใน Programmers.SE ว่าเมื่อไฟล์มีusings มากเกินไป(หลังจากรันคำสั่ง "ลบการใช้งานที่ไม่ได้ใช้") มันเป็นสัญญาณที่ดีที่คลาสภายในไฟล์นี้ทำงานมากเกินไป เช่นเดียวกับขนาดของไฟล์เอง

ในขณะที่ตรวจสอบรหัสฉันเจอไฟล์ 4 ล้าน LOC ปรากฏว่าผู้เขียนรหัสนี้เพียงคัดลอกวางวิธี 15 บรรทัดเดียวกันหลายร้อยครั้งเปลี่ยนชื่อตัวแปรและวิธีการที่เรียกว่าเล็กน้อย regex ง่าย ๆ ที่ได้รับอนุญาตให้ตัดไฟล์จาก 4 000 LOC เป็น 500 LOC เพียงแค่เพิ่มชื่อสามัญเพียงเล็กน้อย ฉันค่อนข้างมั่นใจว่าด้วยการรีแฟคเตอร์ที่ชาญฉลาดยิ่งขึ้นคลาสนี้อาจลดลงเหลือเพียงไม่กี่บรรทัด

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

ภูมิภาค“ ทำ A”, ภูมิภาค“ ทำ B”:

อีกตัวอย่างที่ยอดเยี่ยมคือวิธีการเริ่มต้นมอนสเตอร์ซึ่งทำภารกิจที่ 1 จากนั้นก็คือภารกิจที่ 2 จากนั้นก็ที่งานที่ 3 ฯลฯ มีงานห้าหรือหกงานที่เป็นอิสระโดยสิ้นเชิง งานทั้งหมดเหล่านั้นถูกจัดกลุ่มเป็นวิธีการหนึ่งและจัดกลุ่มเป็นภูมิภาค

สิ่งนี้มีข้อดีอย่างหนึ่ง:

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

ในทางกลับกันปัญหามีหลายรายการ:

  • ไม่ชัดเจนหากมีการพึ่งพาระหว่างภูมิภาค หวังว่าจะไม่มีการใช้ตัวแปรซ้ำ มิฉะนั้นการบำรุงรักษาอาจเป็นฝันร้ายมากยิ่งขึ้น

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

เขตข้อมูลพื้นที่คุณสมบัติพื้นที่คอนสตรัค:

รหัสที่ตรวจสอบยังมีพื้นที่จำนวนมากจัดกลุ่มเขตข้อมูลทั้งหมดเข้าด้วยกันคุณสมบัติทั้งหมดเข้าด้วยกัน ฯลฯ ปัญหานี้มีปัญหาชัดเจน: การเติบโตของรหัสที่มา

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

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

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


13
ฉันคิดว่ามีการใช้ #regions อย่างน้อยสองสามตัวอย่างเช่นการยุบคำสั่ง Guard (การตรวจสอบพารามิเตอร์อินพุต) ซึ่งหากปล่อยทิ้งไว้ไม่ถูกย่อให้เบี่ยงออกจากส่วนสำคัญหรือ "เนื้อ" ของวิธีการ อีกตัวอย่างหนึ่งคือการจัดการข้อยกเว้นในขอบเขต API คุณมักไม่ต้องการส่งผลกระทบต่อการติดตามสแต็กโดยการเรียกวิธีการอื่นเพื่อตัดข้อยกเว้นดังนั้นคุณจึงมีโค้ดหลายบรรทัดที่จะทำการตัดและเรียงใหม่ นี่มักเป็นรหัสที่ไม่เกี่ยวข้องและสามารถยุบได้อย่างปลอดภัย
Daniel B

9
ตรวจสอบความเป็นจริง ฉันเคยเห็น #regions วิธีการระหว่างที่มีประโยชน์มากมาย เมื่อคุณมีวิธีการหลายร้อยบรรทัดที่มีตรรกะการควบคุมแบบซ้อนที่มีหลายสิบถึงหลายร้อยบรรทัด w / ในบางส่วน - ขอบคุณพระเจ้าที่คนโง่อย่างน้อยใส่ในภูมิภาค
Radarbob

37
@radarbob: ในระยะสั้นภูมิภาคมีประโยชน์ในรหัสเส็งเคร็งซึ่งไม่ควรมีอยู่ตั้งแต่แรก
Arseni Mourzenko

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

14
ฉันไม่เห็นด้วยอย่างยิ่งกับคำตอบนี้: กลิ่นเหม็นของรหัสและภูมิภาคไม่มีส่วนเกี่ยวข้องกัน หากรหัสของคุณเหม็นรหัสดังกล่าวจะเหม็นโดยมีหรือไม่มีภูมิภาค วิธีที่ฉันใช้ภูมิภาคคือการแยกชั้นเรียนออกเป็นส่วน ๆ โดยทั่วไปฉันใช้รูปแบบเดียวกันแม้ว่า: คุณสมบัติสาธารณะ, วิธีการสาธารณะ, เขตข้อมูลส่วนตัว, วิธีการส่วนตัว นั่นเป็นสิ่งเดียวที่ฉันจะใช้สำหรับภูมิภาค อะไรก็ตามคุณอาจจะทำลายSRPต้นในรหัสของคุณ
Alexus

113

มันเหลือเชื่อสำหรับฉันว่ามีกี่คนที่เกลียดภูมิภาคอย่างหลงใหล!

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

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

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

ประเด็นก็คือการใช้#regionsเพื่อแยกและแบ่งรหัสของคุณอย่างมีเหตุผลไม่ใช่สิ่งเลวร้ายที่ต้องหลีกเลี่ยงค่าใช้จ่ายทั้งหมด อย่างที่เอ็ดชี้ให้เห็นมันไม่ใช่ "กลิ่นรหัส" หากรหัสของคุณมีกลิ่นคุณสามารถตรวจสอบได้ว่าไม่ได้มาจากภูมิภาค แต่แทนที่จะเป็นรหัสใดก็ตามที่คุณพยายามฝังไว้ในภูมิภาคเหล่านั้น หากคุณลักษณะที่ช่วยให้คุณสามารถที่จะจัดขึ้นหรือเขียนรหัสดีขึ้นแล้วผมบอกว่าจะใช้มัน หากมันกลายเป็นสิ่งกีดขวางหรือคุณพบว่าตัวเองใช้มันอย่างไม่ถูกต้องให้หยุดใช้มัน หากเลวร้ายที่สุดมาถึงแย่ที่สุดและคุณถูกบังคับให้ทำงานกับทีมที่มีคนใช้งานแล้วให้จดจำแป้นพิมพ์ลัดเพื่อปิดรหัสการสรุป: Ctrl+ M, Ctrl+P. และหยุดบ่น บางครั้งฉันรู้สึกว่านี่เป็นอีกวิธีหนึ่งที่ผู้ที่ต้องการถูกมองว่าเป็น "จริง", "ไม่ยอมใครง่ายๆ" โปรแกรมเมอร์ชอบที่จะลองและพิสูจน์ตัวเอง คุณไม่สามารถหลีกเลี่ยงพื้นที่ได้ดีไปกว่าการหลีกเลี่ยงการระบายสีไวยากรณ์ มันไม่ได้ทำให้คุณเป็นนักพัฒนาผู้ชายมากขึ้น

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


9
พูดได้ดี. การใช้พื้นที่สำหรับองค์กรไม่เป็นอันตรายมากกว่าการสลับตัวเลือก "มุมมองช่องว่าง" ของ IDE มันเป็นความชอบส่วนตัว
Josh

24
ทำงานกับ WPF กับ ViewModels ที่มี 10 หรือ 20 คุณสมบัติที่ห่อคุณสมบัติในแบบจำลองของฉันฉันรักภูมิภาค - ฉันสามารถดึงคุณสมบัติเหล่านั้นออกไปในภูมิภาค (พวกเขาไม่จำเป็นต้องสัมผัส) และคอยดูรหัสที่เกี่ยวข้อง
Kirk Broadhurst

4
เห็นด้วยอย่างสิ้นเชิง. ใน. NET 2.0 คุณสมบัติจะมีความยาวประมาณ 8-10 บรรทัด เมื่อคุณมีกว่า 20 คุณสมบัติในระดับที่พวกเขาใช้เวลามากของพื้นที่ ภูมิภาคเหมาะสำหรับการยุบ
Kristof Claes

6
@Kristof: เช่นเดียวกับคุณสมบัติใน. NET 4.0 ที่ทำการตรวจสอบอินพุตอย่างง่าย คุณสมบัติอัตโนมัติยังไม่ได้ทั้งหมดที่วิเศษสำหรับวัตถุประสงค์ของฉัน
โคดี้เกรย์

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

70

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

โดยส่วนตัวฉันไม่ชอบที่จะใช้พื้นที่จำนวนมาก มันทำให้ยากที่จะได้รับรหัสและรหัสคือสิ่งที่ฉันสนใจฉันชอบภูมิภาคเมื่อฉันมีก้อนขนาดใหญ่ของรหัสที่ไม่จำเป็นต้องได้รับการสัมผัสบ่อยมาก นอกเหนือจากที่พวกเขาดูเหมือนจะเข้ามาในตัวฉันและภูมิภาคเช่น "วิธีการส่วนตัว", "วิธีการสาธารณะ" ฯลฯ ก็ทำให้ฉันเป็นบ้า i++ //increment iพวกเขากำลังคล้ายการแสดงความคิดเห็นของความหลากหลาย

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


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

7
ฮ่าฮ่าดีฉันไม่ได้หมายความว่าคำว่า "code ดมกลิ่น" ไม่สามารถใช้งานได้อย่างถูกต้อง มันสามารถทำได้ แต่ฉันเห็นว่ามันถูกโยนทิ้งไปมากในวันนี้ที่ปฏิกิริยาของฉันทันทีเป็นเรื่องน่ารำคาญโดยเฉพาะอย่างยิ่งเมื่อมันมาจากคนที่แค่ทำซ้ำสิ่งที่พวกเขาได้ยินจริง ๆ โดยไม่เข้าใจหรือคิดอย่างมีวิจารณญาณ ข้อความเช่น "มากกว่า 5 ตัวแปรท้องถิ่นในฟังก์ชั่นคือกลิ่นรหัส" เพียงแค่แสดงให้เห็นถึงประสบการณ์เพียงเล็กน้อยที่บุคคลนั้นมี
Ed S.

13
ไม่แน่ใจว่าฉันเข้าใจความคิดเห็นของคุณเกี่ยวกับกลิ่นรหัสหรือไม่ รหัสกลิ่นไม่ได้ระบุว่ามีปัญหาเพียงแค่อาจมีปัญหา
Craig

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

7
แค่อยากจะพูดสอดและพูดว่าการใช้คำอุปมาที่ดีในทางที่ผิดไม่ควรลดคุณค่าคำอุปมา "กลิ่นรหัส" เป็นคำอุปมาที่ยิ่งใหญ่ที่เข้าใจได้ทันทีจดจำได้ง่ายและใช้งานได้ง่าย ยังมีสถานที่มากมายที่ใช้การเปรียบเทียบ "code ดม" ยังคงเป็นวิธีที่ดีที่สุดที่จะได้รับจุดผ่าน
Eric King

23

ใช่ภูมิภาคมีกลิ่นรหัส!

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

คุณลองนึกถึงตัวอย่างหนึ่งที่คุณคิดว่า "geez ฉันหวังว่าเพื่อนร่วมงานของฉันจะใช้บางภูมิภาคที่นี่!"

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

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

กรูมมิ่งวาล!

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


#regions เป็นส่วนหนึ่งของคอมไพเลอร์หรือไม่ ฉันคิดว่าพวกเขาเป็นเพียงคำสั่งของ IDE ที่สามารถเพิกเฉยได้
Steve Rukuts

2
คอมไพเลอร์จะต้องละเว้นพวกเขาเมื่อแยกรหัส C # ของคุณ ถ้ามันไม่เพิกเฉยมันก็จะเกิดขึ้นกับพวกเขา ฉันหมายความว่าอย่างนั้น
Joppe

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

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

15

ฉันใช้ภูมิภาคเป็นวิธีจัดกลุ่มวิธีการหรือส่วนต่าง ๆ ของรหัสด้วยกัน

ดังนั้นไฟล์รหัสอาจมีลักษณะเช่นนี้เมื่อเปิดมัน:

  • คุณสมบัติสาธารณะ
  • ก่อสร้าง
  • บันทึกวิธีการ
  • แก้ไขวิธีการ
  • วิธีการช่วยเหลือส่วนตัว

ฉันไม่ได้ใส่ภูมิภาคไว้ในวิธีการ IMHO ที่เป็นสัญลักษณ์ของกลิ่นรหัส ฉันเคยเจอวิธีการที่ยาวกว่า 1,200 บรรทัดและมี 5 ภูมิภาคที่แตกต่างกัน มันเป็นภาพที่น่ากลัว!

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


14
ฮึ. ฉันรู้ว่านี่เป็นหัวข้อที่เป็นอัตนัย แต่มนุษย์ฉันไม่สามารถทำแบบนี้ได้ จากประสบการณ์ของฉันการเพิ่ม 'องค์กร' ไม่ได้ช่วยอะไรเลยและมันทำให้การเรียกดูรหัสเป็นความเจ็บปวดที่คอ ฉันชอบวิธีการจัดกลุ่มไม่เพียง แต่โดยตัวดัดแปลงการเข้าถึง แต่โดยความรับผิดชอบเชิงตรรกะ สำหรับอินเทอร์เฟซสาธารณะฉันมักจะจัดกลุ่มแต่ละวิธี / คุณสมบัติด้วยกัน แต่บ่อยครั้งที่วิธีที่ได้รับการป้องกันอาจเรียกใช้ฟังก์ชั่นตัวช่วยส่วนตัวและในกรณีนั้นฉันชอบฟังก์ชั่นตัวช่วย (ซึ่งอาจจะใช้ วิธีการที่เรียกว่า
Ed S.

3
@Ed S. - นั่นคือเหตุผลที่ฉันพูดว่า "อาจดูเหมือน" มันเป็นเรื่องส่วนตัวมาก ฉันไม่ได้บอกว่าทุกไฟล์ควรมีลักษณะเช่นนั้น ฉันจะแปลกใจถ้าพวกเขาทำ เป็นเพียงตัวอย่างในหัวข้อที่ซับซ้อน :)
Tyanna

โอ้ฉันรู้เหมือนที่ฉันพูด มันเป็นเรื่องส่วนตัว อะไรก็ตามที่เหมาะกับคุณ / ทีมของคุณ ฉันเพิ่งจะออกมาสำหรับรูปแบบนี้เพราะมันใช้งานไม่ได้ (สำหรับฉัน) แต่ฉันต้องรักษาโครงการที่ทำเช่นนี้ มันทำให้ฉันเป็นบ้า
Ed S.

3
@EdS ดังนั้นไปที่ตัวเลือกของคุณใน vs และปิดภูมิภาค แก้ไขปัญหา.
Andy

ทำไมวัตถุของคุณมีวิธีการบันทึก? :(
TheCatWhisperer

10

การใช้#regionบล็อกเพื่อทำให้คลาสที่อ่านได้มีขนาดใหญ่มากมักเป็นสัญญาณของการละเมิดหลักการความรับผิดชอบเดี่ยว หากพวกเขาคุ้นเคยกับพฤติกรรมของกลุ่มก็อาจเป็นไปได้ที่คลาสนั้นทำมากเกินไป (ละเมิด SRP อีกครั้ง)

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


5

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

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

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

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

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


4

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

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

จากประสบการณ์ของผมวิธีที่มีโค้ดหลายร้อยบรรทัดนั้นเป็นกลิ่นที่แน่นอน


4

กฎง่ายๆของฉันคือ: หากคุณมีไฟล์มากกว่า 5 ภูมิภาคมันเป็นกลิ่นรหัส

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

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


4

ภูมิภาคมีการใช้งานของพวกเขา

ฉันได้ใช้พวกเขาเป็นการส่วนตัวสำหรับ "อินเตอร์เฟสการเข้ารหัสด้วยมือ" ก่อนหน้านี้สำหรับแอพพลิเคชั่นของ windows

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

ดังนั้นในขณะที่ฉันไม่ได้ใช้บ่อยๆพวกเขาก็ดีสำหรับการลบโค้ดขนาดใหญ่


1
ฉันใช้ตัวสร้างรหัสที่คล้ายกันและต้องการใช้คลาสบางส่วนเพื่อลบรหัสที่สร้างขึ้น
Craig

เราทำเช่นนั้นภูมิภาคอยู่ในรหัสที่สร้างขึ้นเพื่อให้ง่ายต่อการอ่านหรือแก้ไขข้อบกพร่อง (ถ้าจำเป็น)
Ken

4

ถ้าคุณมีภูมิภาคในรหัสคุณอย่างแน่นอนมีปัญหา (ยกเว้นกรณีของรหัสที่สร้างขึ้น.) วางภูมิภาคในรหัสเป็นพื้นพูดว่า "refactor นี้".

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


1
เป็นกรณีการใช้งานที่ดีกว่าสำหรับคลาสบางส่วนที่เก็บไว้ในไฟล์แยกต่างหากหรือบางทีอาจเป็น IMyDataSource แบบฉีดด้วยการใช้งาน HardcodedDataSource
ไบรอัน Boettcher

3

ในโครงการที่ผ่านมามีวิธีการสาย 1,700 มีหลายภูมิภาคที่ฝังอยู่ในมัน สิ่งที่น่าสนใจคือภูมิภาคต่าง ๆ แสดงให้เห็นถึงการกระทำที่แตกต่างที่เกิดขึ้นภายในวิธีการ ฉันสามารถสร้าง refactor -> วิธีการแยกในแต่ละภูมิภาคโดยไม่กระทบการทำงานของรหัส

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


3

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

ฉันสามารถแบ่งรหัสโดยใช้พื้นที่ที่ฉันเคยเห็นมาเป็นสามประเภท:

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

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

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


3

ฉันจะบอกว่ามันเป็น "กลิ่นรหัส"

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


@Andrew Grimm: ใช่
whatsisname

3

ฉันใช้ภูมิภาคเพื่อสิ่งหนึ่งเท่านั้น (อย่างน้อยฉันไม่สามารถนึกถึงสถานที่อื่นที่ฉันใช้พวกเขา): เพื่อทดสอบหน่วยกลุ่มสำหรับวิธีการ

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

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


1
คุณเคยมีการทดสอบที่ทดสอบมากกว่าหนึ่งวิธีหรือไม่?
Marcie

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

2

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

ปลั๊กอินนี้จะเพิ่มขนาดตัวอักษรของพื้นที่เล็กที่สุด พวกมันจะถูกขยายดังนั้นคุณจะไม่ต้องกด ctr + m + l เพื่อเปิดทุกภูมิภาค มันไม่สามารถแก้ไขรหัสมะเร็งในรูปแบบนี้ได้ แต่ทำให้สามารถทนได้


0

ฉันใช้ภูมิภาคเพื่อรวมการมองเห็นและประเภทสมาชิกแต่ละชุด ดังนั้นฟังก์ชั่นส่วนตัวทั้งหมดจึงเข้าสู่ภูมิภาคเป็นต้น

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

#region "private_static_members"
 /// <summary>
 /// cache for LauncherProxy
 /// </summary>
private static LauncherProxy _launcherProxy;
#endregion

#region "protected_const_properties"
protected LauncherProxy LauncherProxy{
  get{
    if(_launcherProxy==null) {
      if (!God.Iam.HasProxy(LauncherProxy.NAME)) {
        God.Iam.RegisterProxy(new LauncherProxy());
      }
      _launcherProxy=God.Iam.Proxy(LauncherProxy.NAME) as LauncherProxy;
    }
    return _launcherProxy;
  }
}
#endregion

ลงในรหัสและให้แต่ละส่วนอย่างเรียบร้อยซุกเข้าไปในพื้นที่ที่เหมาะสม

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

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

การแยกประเภทอื่น ๆ เท่านั้นคือวิธี - ฉันจะแบ่งวิธีเป็นคำสั่งฟังก์ชั่นและตัวจัดการดังนั้นฉันจะมีพื้นที่สำหรับคำสั่งสาธารณะส่วนตัว ฯลฯ คำสั่ง ฯลฯ

นี้ทำให้ผมเมล็ด แต่มันเป็นเรื่องที่สอดคล้องชัดเจนเมล็ดฉันสามารถพึ่งพา


-1 ทันทีที่ฉันได้ 125 คะแนนลง downvote คุณกำลังเพิ่มบรรทัดของโค้ดที่ไม่จำเป็น ทำไมคุณต้องใส่พื้นที่รอบ ๆ ... ถ้า (God.Iam.AbusingRegions () == true) myName = "Mark"
DeadlyChambers

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

1
คุณสามารถ refactor ที่เป็น: ป้องกัน LauncherProxy LauncherProxy => God.Iam.GetOrAddProxy <LauncherProxy> (อ้างอิง _launcherProxy); และตอนนี้คุณไม่จำเป็นต้องใช้พื้นที่ นอกจากนี้ยังสามารถเปลี่ยนชื่อ _launcherProxy เป็น _launcherProxyCache เพื่อให้คุณไม่ต้องการภูมิภาคหรือแสดงความคิดเห็นที่นั่น
aeroson

0

ภูมิภาคคือนิพจน์ของตัวประมวลผลล่วงหน้า - กล่าวอีกนัยหนึ่งพวกเขาจะได้รับการปฏิบัติเหมือนความคิดเห็นและโดยพื้นฐานแล้วคอมไพเลอร์ พวกเขาล้วนเป็นเครื่องมือทางภาพที่ใช้ใน Visual Studio ดังนั้น #region ไม่ใช่รหัสที่มีกลิ่นเพราะไม่ใช่รหัส กลิ่นรหัสนั้นเป็นวิธี 800 บรรทัดซึ่งมีความรับผิดชอบที่แตกต่างกันมากมายฝังอยู่ภายใน ฯลฯ ดังนั้นหากคุณเห็น 10 ภูมิภาคในวิธีเดียว - อาจใช้เพื่อซ่อนกลิ่นรหัส ต้องบอกว่าฉันได้เห็นพวกเขาใช้อย่างมีประสิทธิภาพอย่างยิ่งเพื่อทำให้ชั้นเรียนดูเป็นที่ชื่นชอบมากขึ้นและสามารถใช้งานได้ดีขึ้น - ในชั้นเรียนที่มีการเขียนและมีโครงสร้างที่ดีมากเช่นกัน!


0

ภูมิภาคเป็นแนวความคิดขององค์กรที่ดี แต่ล้มเหลวในการคำนึงถึงแนวโน้มของนักพัฒนาบางคนที่ต้องการจัดหมวดหมู่ทุกอย่างและโดยทั่วไปไม่จำเป็นตามแนวทางปฏิบัติของ OOP ที่ทันสมัยที่สุด ... พวกเขาเป็น "กลิ่น" ในแง่ที่ว่า ที่ชั้นเรียนของคุณ / วิธีการอยู่ไกลขนาดใหญ่เกินไปและควรจะ refactored ตามที่คุณมีแนวโน้มที่จะละเมิด "S" หลักการ SOLID ... แต่ชอบกลิ่นใด ๆ ก็ไม่จำเป็นต้องหมายถึงสิ่งที่เป็นไปไม่ดี

ภูมิภาคมีจุดประสงค์ในการใช้รหัสการทำงานมากกว่ารหัสเชิงวัตถุ IMO ซึ่งคุณมีฟังก์ชั่นที่ยาวของข้อมูลตามลำดับที่มันเหมาะสมที่จะสลายตัว แต่มีบางครั้งที่ฉันใช้มันใน c # และพวกเขาเกือบตลอดเวลา เน้นที่โค้ดที่คุณไม่จำเป็นต้อง / ต้องการดู สำหรับฉันเหล่านี้มักจะเป็นค่าคงที่สตริง SQL ดิบในฐานรหัสที่ใช้สำหรับ NPoco หรือตัวแปร ถ้าคุณไม่สนใจว่าข้อมูลจะมาเติมเต็มวัตถุ POCO ผ่าน ORM ของคุณอย่างไรสิ่งเหล่านี้ก็ไม่มีจุดหมายที่จะมอง ... และถ้าคุณสนใจก็แค่ขยายขอบเขตและBAM! 150+ บรรทัดของข้อความค้นหา SQL ที่ซับซ้อนเพื่อความเพลิดเพลินในการรับชมของคุณ

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