Một người trợ giúp là gì? Có phải là một mẫu thiết kế? Nó có phải là một thuật toán?


40

Có thể hơi khó hiểu, nhưng vì tôi không thể tìm thấy câu trả lời này ở bất cứ đâu thông qua Google, vì vậy để đảm bảo Kỹ thuật phần mềm có câu trả lời:

Một người trợ giúp là gì?

Tôi đã thấy tên được sử dụng ở mọi nơi (tên mô-đun, tên lớp, tên phương thức), như thể ngữ nghĩa sâu sắc và có ý nghĩa, nhưng trong bối cảnh Khoa học Máy tính (mặc dù tôi không có bằng cấp về nó), tôi ' chưa bao giờ thấy một mô tả hoặc định nghĩa bất cứ nơi nào!

Có phải là một mẫu thiết kế? Nó có phải là một thuật toán? Tôi đã từng làm việc trên một chương trình trong đó các module và lớp đều gọi somethingsomethinghelper (nơi somethingsomething là khá chung chung quá) và tôi nhanh chóng đổi tên nó thành cái gì đó có ý nghĩa với tôi, nhưng tôi cảm thấy như tôi là thiếu một cái gì đó ở đây!


9
Người trợ giúp là những gì bạn gọi một cái gì đó khi bạn không biết nên gọi nó là gì nhưng bạn biết một trong những người bạn của nó. Kiểu như gọi bạn là 'bạn của Zack' thay vì Aaron. Nhân đôi cộng với vô duyên.
david.pfx

Một người trợ giúp là bất kỳ thành viên tư nhân, cho đến đẳng cấu.
Thomas Eding

@ThomasEding xin lỗi để quay lại 3 năm sau - nhưng tôi đã thấy rất nhiều thành viên "công khai" được gọi là "người trợ giúp", bao gồm cả giao diện. Tôi muốn một nguồn theo định nghĩa của bạn (chất lượng càng cao càng tốt) bởi vì điều đó chắc chắn sẽ mang lại cho tôi cảm giác về mùi mã hơn.
Aaron Hall

Câu trả lời:


63

Lớp Helper là một mùi mã ít được biết đến hơn, nơi một lập trình viên đã xác định một số hoạt động linh tinh, thường được sử dụng và cố gắng làm cho chúng có thể tái sử dụng bằng cách gộp chúng lại thành một nhóm không tự nhiên. Các nhà phát triển kế tiếp sau đó đã tham gia vào dự án và không nhận ra rằng lớp trình trợ giúp tồn tại và do đó đã viết lại các hoạt động chung tương tự hoặc thậm chí tạo ra nhiều lớp Trình trợ giúp hơn.

Nhưng nghiêm túc, vấn đề chính với các lớp Helper là chúng thường là các hoạt động hoạt động trên một lớp cụ thể, điều này rõ ràng có nghĩa là theo thuật ngữ OO rằng chúng đang phải chịu đựng một trường hợp cấp tính của Envy Feature . Thất bại trong việc đóng gói hành vi với dữ liệu mà nó hành động là lý do tại sao các nhà phát triển thường xuyên (theo kinh nghiệm của tôi) không tìm thấy nó.

Thêm vào đó, như bạn đã xác định SomethingS SomethingHelper thực sự là một cái tên khủng khiếp. Nó không được mô tả và không cung cấp cho bạn sự hiểu biết thực sự về loại hoạt động nào mà lớp thực hiện (nó có giúp ích gì không?), Điều đó cũng có nghĩa là không rõ ràng khi thêm các hành vi mới cho dù chúng có thuộc lớp Helper hay không. Tôi sẽ chia các lớp như vậy dọc theo các dòng hành vi liên quan để nhóm lại với nhau một cách hợp lý, và sau đó đổi tên các lớp mới để phản ánh những gì nó làm.


9
Khá chắc chắn rằng đó SomethingSomethingHelperkhông phải là tên thực sự của lớp. Việc đó có phải là mùi mã hay không sẽ phụ thuộc vào mức độ cụ thể của lớp người trợ giúp, vì các lớp của người trợ giúp giống như Mathkhông phải là mùi mã.
Robert Harvey

10
@RobertHarvey - Nâng cao, hầu hết những cái tôi thấy đã được đặt tên SomethingSomethingHelper. Chết tiệt, tôi đang nhìn vào một lớp ngay bây giờ được đặt tên HelperMethodstrong <company>.Helperskhông gian tên. Đối với tôi, một Helperlớp học trong cùng một thùng như *Manager.
Telastyn

8
@Telastyn: Có lẽ đó là một điều kinh nghiệm. Tôi đã xem qua các lớp trợ giúp trong dự án hiện tại của tôi (có một số) và tất cả chúng đều có tên có ý nghĩa. Chỉ có một cái duy nhất có hậu tố Helpervà tôi nghĩ đó là để phân tán nó khỏi một lớp trong .NET Framework có cùng tên. Tôi sẽ xem xét *Helperchấp nhận nếu *một cái gì đó có ý nghĩa. HelperMethodschỉ là một sự thất bại của trí tưởng tượng; ít nhất phải có xô khái niệm cụ thể.
Robert Harvey

4
@RobertHarvey - Có lẽ bạn đúng. Tất cả sự nghiệp của tôi sử dụng các ngôn ngữ hiện đại đã được làm sạch các xác tàu hỏa.
Telastyn

1
Có một tập hợp con trong số này, được gọi là "hàm trợ giúp", thực sự hữu ích và là một mẫu tốt. Ví dụ, một tập hợp các dòng phổ biến cần lặp lại trong một hàm - một ví dụ về nơi chúng hiển thị là khi bạn cần một do..whilevòng lặp trong Python, ngôn ngữ không hỗ trợ (xem ví dụ thứ hai ở đây ). Một cấu trúc khác sẽ là cấu trúc if / elif /.../, nhưng cần lặp lại một trường hợp ở trên cùng và dưới cùng. Tuy nhiên, nếu có thể, chúng nên được đặt cục bộ cho chức năng đó, và nói chung không thực sự được gọi là "người trợ giúp".
Izkata

5

Một người trợ giúp là một lớp hoặc phương thức bổ sung vô hại, miễn là nó bổ sung cho một thành phần bên ngoài. Khi nó làm ngược lại, thì nó chỉ ra thiết kế xấu bởi vì mã đã bị loại trừ khỏi quyền hạn của nó, nếu có bất kỳ thẩm quyền nào cả.

Dưới đây là một ví dụ về một người trợ giúp vô hại, tôi sử dụng một phương pháp được gọi là FindRepđếm số lượng các số 0 đứng đầu.

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

Phương pháp trợ giúp rất đơn giản, nhưng rất bất tiện khi sao chép-dán xung quanh và khung không cung cấp bất kỳ giải pháp nào.

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;
}

Và đây là một ví dụ về một người trợ giúp tồi:

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

Công ty của tôi đã từng sử dụng phương thức lớp Cơ sở / Lớp trợ giúp trong đó mỗi đối tượng sẽ có hai lớp. Bạn sẽ có một lớp Person chứa tất cả các thuộc tính và định nghĩa của lớp và một lớp PersonHelper chứa tất cả các phương thức, các câu lệnh SQL và Logic điều khiển lớp Person. Điều này hoạt động tốt với chúng tôi vì tất cả các ứng dụng của chúng tôi sử dụng các câu lệnh SQL để thao tác dữ liệu và chúng tôi rất dễ dàng tìm thấy và sửa đổi các câu lệnh SQL khi cần.

Chúng tôi đã chuyển đi và bây giờ đặt mọi thứ vào lớp Người / Cơ sở. Chúng tôi bỏ sử dụng quy ước đặt tên của Trình trợ giúp vì chúng tôi muốn có ít tệp hơn trong các dự án của mình. Ngoài ra, độ dài của một số tên lớp đã vượt khỏi tầm kiểm soát. haha

Không phải là một ví dụ tuyệt vời nhưng bạn có được ý tưởng.

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

Tôi không nói rằng sử dụng quy ước đặt tên của người trợ giúp là giải pháp hoàn hảo nhưng nó đã có hiệu quả đối với chúng tôi trong một vài năm.


2
Bạn đã không giải thích tại sao.
Robert Harvey

2
Vâng, tôi cũng muốn lời giải thích đó.
Aaron Hall

@AaronHall Hãy coi đó là một điều tốt mà bạn không hiểu sự lựa chọn của họ.
Leopold Asperger
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.