Я чувствую, что этот код можно было бы очистить больше или он мог бы быть короче, но и более понятным. Любые советы / предложения приветствуются.
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 ответа
Переключение логики @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;
}
Код выглядит аккуратно и чисто. Если вы хотите, вы можете изменить это на
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()
меня устраивает.
Интересно посмотреть, как это по сути сводится к FizzBuzz.
— Ошибка