ผู้ช่วยคืออะไร? มันเป็นรูปแบบการออกแบบหรือไม่? มันเป็นอัลกอริทึมหรือไม่?


40

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

ผู้ช่วยคืออะไร?

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

มันเป็นรูปแบบการออกแบบหรือไม่? มันเป็นอัลกอริทึมหรือไม่? ฉันเคยทำงานในโปรแกรมที่ทั้งโมดูลและคลาสเรียกว่าsomethingsomethinghelper (ซึ่งsomethingsomethingนั้นค่อนข้างสามัญด้วยเช่นกัน) และฉันเปลี่ยนชื่อเป็นบางสิ่งที่สมเหตุสมผลสำหรับฉัน แต่ฉันรู้สึกว่าฉันขาดอะไรบางอย่างที่นี่!


9
ตัวช่วยเป็นสิ่งที่คุณเรียกบางอย่างเมื่อคุณไม่รู้ว่าจะเรียกมันว่าอะไร แต่คุณรู้จักเพื่อนคนหนึ่ง ชอบโทรหาคุณ 'เพื่อนของแซค' แทนแอรอน บวกกับไม่ดี
david.pfx

ผู้ช่วยเป็นสมาชิกส่วนตัวใด ๆ ได้ถึงมอร์ฟิซึ่มส์
Thomas Eding

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

คำตอบ:


63

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

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

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


9
SomethingSomethingHelperค่อนข้างแน่ใจว่าไม่ใช่ชื่อจริงของคลาส ไม่ว่าจะเป็นกลิ่นรหัสหรือไม่จะขึ้นอยู่กับวิธีการเฉพาะระดับผู้ช่วยคือเป็นชั้นเรียนผู้ช่วยที่ชอบMathไม่ได้กลิ่นรหัสที่ทั้งหมด
Robert Harvey

10
@RobertHarvey - Enh ส่วนใหญ่ของคนที่ผมได้เห็นได้SomethingSomethingHelperรับการตั้งชื่อ เฮ้ฉันกำลังดูชั้นเรียนตอนนี้ตั้งชื่อHelperMethodsใน<company>.Helpersเนมสเปซ ให้ฉันเป็นระดับที่อยู่ในถังเดียวกับHelper *Manager
Telastyn

8
@Telastyn: บางทีมันอาจเป็นประสบการณ์ ฉันได้ดูชั้นเรียนผู้ช่วยในโครงการปัจจุบันของฉัน (มีหลายรายการ) และพวกเขาทั้งหมดมีชื่อที่มีความหมาย มีเพียงคนเดียวที่ต่อท้ายด้วยHelperและฉันคิดว่ามันจะแก้ปัญหาจากชั้นเรียนใน. NET Framework ที่มีชื่อเดียวกัน ฉันจะถือว่า*Helperยอมรับได้ถ้า*เป็นสิ่งที่มีความหมาย HelperMethodsเป็นเพียงความล้มเหลวของจินตนาการ อย่างน้อยก็ควรจะมีถังความคิดที่เฉพาะเจาะจง
Robert Harvey

4
@RobertHarvey - คุณอาจพูดถูก อาชีพการงานของฉันโดยใช้ภาษาสมัยใหม่ทำให้การทำลายซากรถไฟเกิดขึ้น
Telastyn

1
มีส่วนย่อยของสิ่งเหล่านี้เรียกว่า "ฟังก์ชั่นผู้ช่วย" ซึ่งมีประโยชน์จริง ๆ และเป็นรูปแบบที่ดี ตัวอย่างเช่นชุดของบรรทัดทั่วไปที่จะต้องทำซ้ำภายในฟังก์ชัน - ตัวอย่างหนึ่งที่แสดงขึ้นมาคือเมื่อคุณต้องการdo..whileลูปใน Python ซึ่งภาษาไม่สนับสนุน (ดูตัวอย่างที่สองที่นี่ ) อีกโครงสร้างหนึ่งคือ if / elif /.../ else แต่จำเป็นต้องทำซ้ำตัวพิมพ์ใหญ่ที่ด้านบนและด้านล่าง ถ้าเป็นไปได้พวกเขาควรจะทำในท้องถิ่นเพื่อฟังก์ชั่นแม้ว่าและโดยทั่วไปไม่ได้เรียกว่า "ผู้ช่วย"
Izkata

5

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

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

digits = digits.Remove(0, TextHelper.FindRep('0', digits, 0, digits.Length - 2));

วิธีการช่วยเหลือนั้นง่ายมาก แต่ไม่สะดวกในการคัดลอกและวางกรอบไม่ได้ให้วิธีการแก้ปัญหาใด ๆ

public static int FindRep(char chr, string str, int beginPos, int endPos)
{
    int pos;

    for (pos = beginPos; pos <= endPos; pos++)
    {
        if (str[pos] != chr)
        {
            break;
        }
    }

    return pos - beginPos;
}

และนี่คือตัวอย่างของผู้ช่วยที่ไม่ดี:

public static class DutchZipcodeHelper
{
    public static bool Validate(string s)
    {
        return Regex.IsMatch(s, @"^[1-9][0-9]{3}[A-Z]{2}$", RegexOptions.IgnoreCase);
    }
}

public class DutchZipcode
{
    private string value;

    public DutchZipcode(string value)
    {
        if (!DutchZipcodeHelper.Validate(value))
        {
            throw new ArgumentException();
        }

        this.value = value;
    }

    public string Value
    {
        get { return value; }
    }
}

-1

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

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

ไม่ใช่ตัวอย่างที่ดี แต่คุณได้รับความคิด

s = CompanyName.PersonHelper.GetPerson()
s = CompanyName.Person.GetPerson()

ฉันไม่ได้บอกว่าการใช้การตั้งชื่อผู้ช่วยเป็นวิธีแก้ปัญหาที่สมบูรณ์แบบ แต่มันใช้งานได้สำหรับเราไม่กี่ปี


2
คุณไม่ได้อธิบายว่าทำไม
Robert Harvey

2
ใช่ฉันต้องการคำอธิบายเช่นกัน
Aaron Hall

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