Пятничное "а вот как бы наряднее?"
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 27.09.19 07:53
Оценка:
Пятница, можно и подискутировать.

Кто какой способ предпочитает и почему?

class Article
{
    string title;
    string slug;

    // Тот факт, что это конструктор -- не принципиально
    public Article(string title)
    {
        this.title = title;

        // Так?
        ConvertTitleToSlug();

        // Или так?
        ConvertTitleToSlug(title);

        // Или вовсе вот так?
        slug = ConvertTitleToSlug(title);
    }

    private void ConvertTitleToSlug()
    {
        slug = title.ToLowerInvariant().Replace(" ", "-");
    }

    private void ConvertTitleToSlug(string title)
    {
        slug = title.ToLowerInvariant().Replace(" ", "-");
    }

    private static string ConvertTitleToSlug(string title)
    {
        var slug = title.ToLowerInvariant().Replace(" ", "-");
        return slug;
    }
}
HgLab: Mercurial Server and Repository Management for Windows
Re: Пятничное "а вот как бы наряднее?"
От: fmiracle  
Дата: 27.09.19 08:09
Оценка: 9 (1) +6
Здравствуйте, Нахлобуч, Вы писали:

Н>Пятница, можно и подискутировать.

Н>Кто какой способ предпочитает и почему?

По мне лучше всего — почти как последний, но вынести в отдельный класс UrlHelper или, с тем чтобы при необходимости можно было использовать и в других местах, кроме статей (файлы может, или генераторы ссылок, или какие-то тесты которым надо достучаться до статьи и подобное).

В остальном, я бы сказал, что если метод занимается конвертацией, то у него должна быть сигнатура
X ConvertToX( Y y );

Статическая либо не статическая в зависимости от того, нужен ли доступ к полям класса. Предпочтительнее статический (сразу видно что нет неочевидных зависимостей), но без фанатизма. Второй момент выбора статика или нет — есть ли желание покрыть юнит-тестами с изоляцией этого метода. Тогда не статический и виртуальный чтобы можно было подменить заглушкой.

А если он просто именно инициализирует поля, исходя из каких-то данных, то это void InitValues( с параметрами или без ). При этом, мне не очень-то нравится, если часть полей проставляется в одном методе (тут — в конструкторе), а другая — в другом (тут — ConvertTitleToSlug() ) и при этом жить они могут только вместе. Лучше уж или там или там.
Отредактировано 27.09.2019 8:10 fmiracle . Предыдущая версия .
Re: Factory method
От: Qbit86 Кипр
Дата: 27.09.19 08:44
Оценка: 6 (1) +2
Здравствуйте, Нахлобуч, Вы писали:

Н>Тот факт, что это конструктор -- не принципиально


Принципиально.

Первые два способа не подходят, потому что требуют убрать атрибут readonly у полей.
Третий получше, но нарушает Constructor Design.
Поэтому я бы сделал фабричный метод:
public sealed class Article
{
    private readonly string _title;
    private readonly string _slug;

    private Article(string title, string slug)
    {
        Debug.Assert(title != null);
        Debug.Assert(slug != null);

        _title = title;
        _slug = slug;
    }

    public static Article Create(string title)
    {
        if (title is null)
            throw new ArgumentNullException(nameof(title));

        string slug = title.ToLowerInvariant().Replace(" ", "-", StringComparison.Ordinal);
        return new Article(title, slug);
    }
}
Глаза у меня добрые, но рубашка — смирительная!
Re: Пятничное "а вот как бы наряднее?"
От: Sharov Россия  
Дата: 27.09.19 11:44
Оценка: 1 (1)
Здравствуйте, Нахлобуч, Вы писали:

Н>
Н>class Article
Н>{
Н>    string title;
Н>    string slug;

Н>    // Тот факт, что это конструктор -- не принципиально
Н>    public Article(string title)
Н>    {
Н>        this.title = title;

Н>        // Так?
Н>        ConvertTitleToSlug();

Н>        // Или так?
Н>        ConvertTitleToSlug(title);

Н>        // Или вовсе вот так?
Н>        slug = ConvertTitleToSlug(title);
Н>    }

Н>



3-й, static, лучше, ибо его можно отдельно и протестировать, без необходимости создавать объект. Выше уже отметили, что не следует злоупотреблять сложной логикой в конструкторе, хотя сам этим грешу иногда.
Кодом людям нужно помогать!
Re: Пятничное "а вот как бы наряднее?"
От: Ops Россия  
Дата: 30.09.19 15:02
Оценка:
Здравствуйте, Нахлобуч, Вы писали:

Н>Кто какой способ предпочитает и почему?


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

Исключение — методы, которые конвертируют в/из собственного класса, но здесь не тот случай.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: Пятничное "а вот как бы наряднее?"
От: yenik  
Дата: 01.10.19 13:00
Оценка:
Публичных свойств и методов нет. Трудно понять, что автор хочет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.