Действительно ли это - хорошее использование ExtensionMethod?

Я подозреваю, что вы пришли из Python фона , где такое поведение разрешено.
В Scala этого достичь невозможно как есть, потому что структура if / else создает новый блок, а то, что определено в блоке, находится только в таком блоке.
Вы можете исправить это с помощью изменяемой переменной ...

var output: DataFrame = _
if(df2.isEmpty){
  output = df1
}
else{
  output = df2
}

Однако, это очень Java и идет вразрез с неизменным принципом.
В Scala блок является выражением, и поэтому они могут возвращать значения.
Таким образом, это более идиоматический способ решения проблемы в Scala .

val output = if(df2.isEmpty) df1 else df2
10
задан Patrick Klug 27 April 2014 в 23:44
поделиться

8 ответов

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

Ответ "да, Это"

4
ответ дан 3 December 2019 в 23:15
поделиться

Взгляды, хорошие мне, хотя это кажется немного нетрадиционным.

1
ответ дан 3 December 2019 в 23:15
поделиться

Можно также использовать синтаксис метода LINQ для той задачи (при помощи Системы. Пространство имен Linq):

            object[] objects = new object[10];
        objects.Contains(new MyClass());

Хм позвольте мне думать момент... О, Вы уже использование его. Но Вы поместили его в отдельный метод вместо того, чтобы назвать его непосредственно.

1
ответ дан 3 December 2019 в 23:15
поделиться

Необычно записать дополнительный метод для неограниченного T. Не в последнюю очередь этот подход быстро сделает Ваш intellisense довольно трудно для использования.

В то время как допустимый, я, вероятно, избежал бы этого, поскольку дополнительный метод - возможно, просто использует стандартный статический служебный метод.

Синтаксис инициализатора массива C# 3 мог бы быть легче?

bool isTrue = new[] { 1, 2, 3 }.Contains(3);

Конечно, для больших наборов данных, Вы могли бы хотеть кэшировать a HashSet<T> где-нибудь;-p

5
ответ дан 3 December 2019 в 23:15
поделиться

Это кажется довольно справедливым, но я предпринял бы шаги назад. Можно ли поместить какое-либо значение бизнеса в сравнение? Каковы те значения? Возможно, Вы были бы более обеспечены с названным методом IsSpecialCustomerLocation или что-то, что выражает фактическое намерение кода.

1
ответ дан 3 December 2019 в 23:15
поделиться

Вы действительно намереваетесь сделать, Содержит, и гарантия, которую Вы будете применять, Содержит на всех возможных объектах, где Вы могли бы использовать этот дополнительный метод?

Если некоторые данные объекты протестируют равенство путем перегрузки оператора == затем то универсальное решение перестанет работать. Это делает его не истинным эквивалентом нескольких == тесты. Это - также хороший пример опасности записать дополнительные методы!

Следующие Linq кодируют работы при реализации перегрузки оператора, а также если Вы используете значение по умолчанию == значение сравнения ссылок на объект, чтобы сказать, что значение является на самом деле тем же объектом как value1, 2, 3 или 4, учитывая V как тип объекта Ваших значений в данном случае:

V[] lv = { value, value2, value3, value4 };
if (lv.Any( v => v==value))
   // do something

Или краткая версия:

if (new List<V>{value, value2, value3, value4 }.Any( v => v==value))
   // do something

Я не мог заставить вышеупомянутые лямбда-выражения работать в универсальном дополнительном методе.

Как польза (если не важный) примером того, что я думаю, является прекрасный, читаемый синтаксис, идиома в Python была бы

if value in (value1, value2, value3, value4):
1
ответ дан 3 December 2019 в 23:15
поделиться

Я сделал бы статический класс с этой целью. Мне не нравится то решение, потому что оно добавляет метод ко всем классам, который кажется небольшим излишеством. Однако это действительно способом идет с OOD, потому что Вы спрашиваете объекты выполнить функции на себе (своего рода).

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

if (ConditionHelper.IsEqualToAny(value, value1, value2, value3)) 
{
    // Do something
}

Делает то же задание и ничего не загрязняет.

1
ответ дан 3 December 2019 в 23:15
поделиться

Если вы проверяете только значение Enum (как вы сказали в комментарии к ответу Роджерса), вы должны использовать FlagsAttribute в Enum.

[Flags]
public enum Value
{
  Value1 = 0,
  Value2 = 1,
  Value3 = 2,
  Value4 = 4
}

Value value = Value.Value1;
if (value | Value.Value1 | Value.Value2 | Value.Value3 | Value.Value4)
{
  // You can also use other bitwise operations, like & (AND), ^ (XOR) and ~ (NOT)
}

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

0
ответ дан 3 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: