Использование дополнительных методов

Вы должны привязать события к переключателям, вот ваш рабочий код,

var button = document.getElementById('one_way');
var button2 = document.getElementById('round_trip');
button.addEventListener('change', function() {
    if (document.getElementById('one_way').checked) {
    document.getElementById('datepicker1').disabled = true;
  }
})

button2.addEventListener('change', function() {
    if (!document.getElementById('one_way').checked) {
    document.getElementById('datepicker1').disabled = false;
  }
})

Вы также можете проверить его на JSFiddle Code

12
задан Community 23 May 2017 в 12:08
поделиться

9 ответов

Когда использование дополнительных методов имеет смысл?

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

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

Добавляющие дополнительные методы к типу влияют на производительность?

Обратите внимание что дополнительный вызов метода как:

instance.SomeExtensionMethod()

компилируется в:

StaticExtensionMethodClass.SomeExtensionMethod(instance);

таким образом, производительность совпадет с любым другим вызовом статического метода.

11
ответ дан 2 December 2019 в 19:56
поделиться

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

Вы видите это в как LINQ (Система. Пространство имен Linq и другие), прибавляет большую функциональность ко всем наборам.

1
ответ дан 2 December 2019 в 19:56
поделиться

Из моего ответа здесь:

Что касается практического применения для Дополнительных Методов Вы могли бы добавить новые методы к классу, не получая новый класс.

Смотрите на следующий пример:

public class extended {
    public int sum() {
        return 7+3+2;
    }
}

public static class extending {
    public static float average(this extended extnd) {
        return extnd.sum() / 3;
    }
}

Как Вы видите, класс Extending добавляет метод, названный средним числом к классу Extended. Для получения среднего числа Вы звоните average метод, поскольку это принадлежит extended класс:

extended ex = new extended();

Console.WriteLine(ex.average());

Ссылка: http://aspguy.wordpress.com/2008/07/03/a-practical-use-of-serialization-and-extension-methods-in-c-30/


Что касается Производительности я думаю, что Вы видите улучшение с Дополнительными методами, так как они никогда не диспетчеризируются динамично, но все это зависит от того, как динамический метод реализован.

2
ответ дан 2 December 2019 в 19:56
поделиться

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

1
ответ дан 2 December 2019 в 19:56
поделиться

В дополнение к другим ответам дополнительные методы являются отличным способом добавляющей шаблонной реализации к интерфейсам. Например, если Вы хотите все списки tto быть поддающимися сортировке, добавьте дополнительный метод для IList<T>.

Вы можете (как уже указано), также используют дополнительные методы для добавления методов к классам за пределами управления; когда-либо требуемый a Reverse() метод на string? Добавьте тот!

Единственная разница - то, что дополнительные методы не используют виртуальный, и нет никакой пустой проверки. Можно использовать это в ваших интересах, если Вам нравится:

public static void ThrowIfNull<T>(this T obj, string name) where T : class
{
    if(obj == null) throw new ArgumentNullException(name);
}

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

var foo = source.Where(predicate).OrderBy(selector);

намного более читаемо, чем:

var foo = Enumerable.OrderBy(Enumerable.Where(source,predicate),selector);

С обычными методами для использования первого подхода это должны были бы быть регулярные методы экземпляра, которые потребуют изменений (например), в IEnumerable<T> - не желательный.

1
ответ дан 2 December 2019 в 19:56
поделиться

Я не знаю ни о каких последствиях производительности. Используя дополнительные методы имеет большую часть смысла, когда Вы не имеете доступа к исходному коду и таким образом не можете добавить метод к классу непосредственно, и метод имеет смысл быть реализованным как функция. Это переходит к комментарию, который я сделал по Вашему предыдущему вопросу, где еще один человек дал образец для дополнительного метода на 'строковом' классе, который возвратил bool на основе того, была ли строка действующим адресом электронной почты. Это, IMO, является примером если не для использования дополнительного метода, потому что та функция не фундаментальна для строкового типа. Добавление Левого (интервал) и Правильная (международная) функция для 'представления в виде строки' действительно имеет смысл, как бы то ни было.

0
ответ дан 2 December 2019 в 19:56
поделиться

Я использую их для многократного использования моих классов объектной модели. У меня есть набор классов, которые представляют объекты, которые я имею в базе данных. Эти классы используются в стороне клиента только для отображения объектов, таким образом, основное использование получает доступ к свойствам.

public class Stock {
   public Code { get; private set; }
   public Name { get; private set; }
}

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

public static class StockExtender {
    public static List <Quote> GetQuotesByDate(this Stock s, DateTime date)
    {...}
}

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

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

0
ответ дан 2 December 2019 в 19:56
поделиться

Дополнительные методы сияют везде, где функциональное программирование используется.

Рассмотрите почти любые функции уровня Модуля, которые Вы уже имеете в своем приложении и чем они становятся, когда Вы отмечаете их как дополнительные методы. Они становятся возможностью для "действительного залога" по "пассивному залогу". Действительный залог означает чтения кода, как будто экземпляр предоставляет свой собственный метод для выполнения конкретной задачи, вместо того, чтобы иметь функцию выполняют действие пассивно с ним.

ExtendUnlimitedCredit(AddVIP(tblCustomer, "Bill Gates"))

по сравнению с.

tblCustomer.AddVIP("Bill Gates").ExtendUnlimitedCredit()

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

Другие большие вещи о дополнительных методах:

  1. Они делают Ваши функции (из-за Intellisense) более поддающимися обнаружению. И если Вы обеспечили встроенную разметку, описывающую цель и использование Вашей функции, Intellisense даже предоставит полезную подсказку, описывающую метод и его использование разработчику, который обнаруживает его (просто путем нажатия точки). Функции, не отмеченные как дополнительные методы, так легко не обнаружены, может пойти неиспользованный и, в результате кто-то еще может изобрести их собственную разновидность упомянутой функции.

  2. Принимая во внимание, что Вы не можете на самом деле реализовать метод для интерфейса, дополнительные предложения метода, альтернатива означает, что это дает появление, которое Вы сделали так.

1
ответ дан 2 December 2019 в 19:56
поделиться

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

Примером «естественного расширения функциональности» является расширение средства чтения данных для возврата значения по умолчанию, если указан DBNull. Не так естественно было бы расширять средство чтения данных для возврата экземпляра сущности, представленной данными в нескольких полях. В последнем случае вы накладываете неправильные обязанности на плохой объект :).

0
ответ дан 2 December 2019 в 19:56
поделиться