Что я могу сделать лучше, чтобы очистить этот код, сделать его меньше? Только начал практиковать чистый код, нужен совет

Я чувствую, что этот код можно было бы очистить больше или он мог бы быть короче, но и более понятным. Любые советы / предложения приветствуются.

public string GetIPVersions(NetworkInterface @interface)
    {
        string ipVersions = "";

        if (@interface.Supports(NetworkInterfaceComponent.IPv4)) ipVersions += NetworkInterfaceComponent.IPv4;

        if (!@interface.Supports(NetworkInterfaceComponent.IPv6)) return ipVersions;

        ipVersions += ipVersions.Length > 0 ? $" {NetworkInterfaceComponent.IPv6}" : $"{NetworkInterfaceComponent.IPv6}";

        return ipVersions;
    }

 private void UpdatePageText()
    {
        int interfacesCount = Interfaces.Count();
        InterfaceCountText = interfacesCount > 0 ? $"{interfacesCount} interfaces found" : "No interfaces found";
    }

4 ответа
4

Переключение логики @interface.Supports против !@interfaceSupports сбивает с толку код.

Решение добавить пространство лучше как отдельное заявление. Смешивание этого решения с добавлением текста IPv6 затемняет смысл кода.

Всего с двумя случаями вы можете быть более прямым:

public string GetIPVersions(NetworkInterface @interface) {
    boolean supportsIPv4 = ( @interface.Supports(NetworkInterfaceComponent.IPv4) );
    boolean supportsIPv6 = ( @interface.Supports(NetworkInterfaceComponent.IPv6) ); 

    if ( supportsIPv4 ) {
        if ( supportsIPv6 ) {
            return NetworkInterfaceComponent.IPv4 + " " + NetworkInterfaceComponent.IPv6;
        } else {
            return NetworkInterfaceComponent.IPv4;
        }
    } else if ( supportsIPv6 ) {
        return NetworkInterfaceComponent.IPv6;
    } else {
        return "";
    }
}

Сохраняя код ближе к исходному методу:

public string GetIPVersions(NetworkInterface @interface) {
    string ipVersions = "";

    if ( @interface.Supports(NetworkInterfaceComponent.IPv4) ) {
        ipVersions += NetworkInterfaceComponent.IPv4;
    }

    if ( @interface.Supports(NetworkInterfaceComponent.IPv6) ) {
        if ( ipVersions.Length > 0 ) {
            ipVersions += " ";
        }
        ipVersions += NetworkInterfaceComponent.IPv6;
    }

    return ipVersions;
}

  • Интересно посмотреть, как это по сути сводится к FizzBuzz.

    — Ошибка

Код выглядит аккуратно и чисто. Если вы хотите, вы можете изменить это на

private void UpdatePageText()
    {
        InterfaceCountText = Interfaces.Count() > 0 ? $"{Interfaces.Count()} interfaces found" : "No interfaces found";
    }

    Вот еще один подход, хотя он может быть немного менее понятным.
    По сути, он создает массив строк или нулей, отфильтровывает нули и объединяет оставшиеся с разделителем.
    Одним из преимуществ этого подхода является то, что его можно легко расширить для поддержки большего числа случаев.

    public string GetIPVersions(NetworkInterface @interface)
    {
        return
            String.Join(
                " ",
                new string[] {
                    @interface.Supports(NetworkInterfaceComponent.IPv4) ? NetworkInterfaceComponent.IPv4.ToString() : null,
                    @interface.Supports(NetworkInterfaceComponent.IPv6) ? NetworkInterfaceComponent.IPv6.ToString() : null,
                }
                .Where(x => x != null));
    }
    

    Первая функция имеет некоторую запутанную логику: if и if (!), Которые неожиданно возвращаются в середине, дополнительный троичный элемент для обработки пространства. Это очень много, чтобы понять, что сводится к показу IPV4 и / или IPV6.

    Для простых функций это не имеет большого значения, но я бы постарался, чтобы разные части были четкими, предельно простыми и нисходящими. string.Join() идеально подходит для конкатенации через пробел или запятую, давайте воспользуемся им.

        public string GetIpVersions(NetworkInterface @interface) {
            var supported = new List<NetworkInterfaceComponent>();
    
            if (@interface.Supports(NetworkInterfaceComponent.IPv4)) supported.Add(NetworkInterfaceComponent.IPv4);
            if (@interface.Supports(NetworkInterfaceComponent.IPv6)) supported.Add(NetworkInterfaceComponent.IPv6);
    
            return string.Join(" ", supported);
        }
    

    UpdatePageText() меня устраивает.

      Добавить комментарий

      Ваш адрес email не будет опубликован. Обязательные поля помечены *