Когда мой метод - Помощник, Утилита или должен быть превращен в Расширение? - PullRequest
1 голос
/ 26 сентября 2011

Например, эту функцию шифрования можно назвать утилитой?

public static string HashText(string text)
{
    byte[] encodedBytes;
    using (var md5 = new MD5CryptoServiceProvider())
    {
        var originalBytes = Encoding.UTF8.GetBytes(text);
        encodedBytes = md5.ComputeHash(originalBytes);
    }
    return Encode(encodedBytes);
}

В то время как эта другая функция будет помощником?

public static string Encode(byte[] byteArray)
{
    if (byteArray == null || byteArray.Length == 0)
        return "";

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < byteArray.Length; i++)
    {
        sb.Append(byteArray[i].ToString("x2"));
    }
    return sb.ToString();
}

Как насчет расширения, можете ли вы предоставить какое-либопримеры того, когда я должен превратить что-то в расширение метода?

Ответы [ 3 ]

3 голосов
/ 26 сентября 2011

Когда делать метод статическим вспомогательным методом или методом расширения, это субъективное решение. Если вам нужна помощь в принятии решения о том, следует ли делать метод методом расширения, спросите себя, имеет ли смысл включать этот метод в другой класс как обычный метод экземпляра.

Например, у вас может быть такой метод:

public class Customers
{
    public static Customer GetCustomer(string name)
    {
        // implementation
        return customer;
    }
}

Имеет ли это смысл как метод экземпляра класса String?

public class String
{
    public Customer GetCustomer()
    {
        // implementation
        return customer;
    }

    // other methods
}

В плане дизайна это сводит класс String к совершенно не связанному классу. Это делает класс String «кухонной раковиной», которая собирает все и вся, что связано со строками.

С другой стороны, предположим, что у вас есть такой метод:

public class StringHelper
{
    public static string[] Split(string s, string separator)
    {
            // implementation
            return array;
    }
}

Имеет ли это смысл как метод экземпляра класса String?

public class String
{
    public string[] Split(string separator)
    {
            // implementation
            return array;
    }

    // other methods
}

Абсолютно! Это естественное расширение к существующей Split функциональности. Может быть включено в исходную реализацию String.

Все промежуточное может оцениваться в каждом конкретном случае.

2 голосов
/ 26 сентября 2011

Я не уверен, что это совершенно правильно, но я часто слышал, что термины помощник и утилита используются взаимозаменяемо.Они оба кажутся мне довольно неформальными терминами, поскольку они относятся к организационному подходу, а не к чему-то конкретному о том, как язык обрабатывает их.Тем не менее, есть некоторые коннотации, которые могут прояснить для вас некоторую путаницу.

Служебный метод, как правило, часто используется, но не специфичен для вашего приложения.Методы Cosine и Sine являются хорошими примерами этого.

Вспомогательный класс или вспомогательный метод обычно используются часто, но они специфичны для вашего приложения.Шифрование является хорошим примером, потому что используемые методы шифрования варьируются от приложения к приложению.

С учетом того, когда вам следует написать служебный метод, ответом будет то, что на самом деле ситуация типа «не следует» или «не следует»,Существует незначительная разница (если таковая имеется), когда речь заходит о производительности, и то, используете ли вы метод расширения или передаете параметр вспомогательному / служебному методу, является исключительно вопросом предпочтения.Хотя метод расширения может показаться более понятным, есть много языков, которые не поддерживают методы расширения, поэтому ни один из подходов не является неправильным и незначительно повлияет на читабельность вашего исходного кода.

0 голосов
/ 26 сентября 2011

Что касается методов расширения, их не следует использовать слишком много.

Методы расширения лучше всего подходят, когда кажется, что они расширяют существующую функциональность объекта.Например, вы можете расширить StringBuilder методом AppendHex.

Однако, если функциональность кажется не связанной с объектом или с его существующей функциональностью, лучше использовать класс «утилиты».Этим методам будет легче читать, писать и понимать.

...