Пользовательский Набор по сравнению с Универсальным набором для [закрытых] открытых методов

Я всегда использую < dl> для часто задаваемых вопросов. Обычно делая < dt> привязка для индекса вопросов связаться.

редактирование...

я должен упомянуть, это - моя интерпретация самого семантического подхода. Поскольку я вижу его, это - точно вид вещи < dl> предназначен для повышения.

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

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

12
задан Stephen Kennedy 8 December 2018 в 16:39
поделиться

6 ответов

В общем, лучше всего открыть один из интерфейсов, например IEnumerable , ICollection или IList вместо конкретного класса.

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

Если вы знаете ожидаемые шаблоны использования ваших «коллекций», вы должен предоставить соответствующий API, который в будущем будет минимально ограничивать вас. Если, например, вы знаете, что людям просто нужно повторить ваши результаты, выставьте IEnumerable , чтобы вы могли позже перейти на ЛЮБУЮ коллекцию или даже просто переключиться на использование yield return напрямую.

Если вы знаете ожидаемые шаблоны использования ваших «коллекций», вы должны предоставить соответствующий API, который будет обеспечивать наименьшие ограничения для вас в будущем. Если, например, вы знаете, что людям просто нужно повторить ваши результаты, выставьте IEnumerable , чтобы вы могли позже перейти на ЛЮБУЮ коллекцию или даже просто переключиться на использование yield return напрямую.

Если вы знаете ожидаемые шаблоны использования ваших «коллекций», вы должны предоставить соответствующий API, который будет обеспечивать наименьшие ограничения для вас в будущем. Если, например, вы знаете, что людям просто нужно повторить ваши результаты, выставьте IEnumerable , чтобы вы могли позже перейти на ЛЮБУЮ коллекцию или даже просто переключиться на использование yield return напрямую.

9
ответ дан 2 December 2019 в 04:25
поделиться

Я бы выбрал второй. Код клиента в любом случае должен знать тип изображения.

Первый означает только больше кода.

5
ответ дан 2 December 2019 в 04:25
поделиться

Если вы создаете общедоступный API, рассмотрите возможность использования пользовательской коллекции, чтобы получить следующие преимущества:

  • Расширяемость - вы можете добавлять функции в свою пользовательскую коллекцию в будущем, не меняя API.

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

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

Если это ' s только для кода внутреннего использования, решение не обязательно так важно, и вы можете решить пойти с «проще - лучше».

Примером, который мне не нравится, является API ArcGIS Server от ESRI - они используют пользовательские коллекции в своих API. В основном по этим причинам мы также используем пользовательские коллекции в наших API.

13
ответ дан 2 December 2019 в 04:25
поделиться

Единственная причина использовать Collection - это если вы хотите подключиться к набору виртуальных методов, который позволяет вам видеть все мутации базовых список. Это позволяет вам выполнять такие операции, как реагировать на удаления, реализовывать события и т. Д.

Если вам не интересно отвечать или наблюдать за этими изменениями коллекции, то List является более подходящим тип.

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

Это не ошибка jQuery, это неотъемлемая часть того, как JavaScript обрабатывает объекты.

В отличие от большинства других объектно-ориентированных языков, 'this' не привязано на уровне каждого метода в JavaScript; вместо этого он определяется исключительно способом вызова функции:

Bob= {
    toString: function() { return 'Bob!'; },

    foo: function() { alert(this); }
};
Brian= {
    toString: function() { return 'Brian!'; },
};

Bob.foo(); // Bob!
Bob['foo'](); // Bob!

Brian.foo= Bob.foo;
Brian.foo(); // Brian! NOT Bob

var fn= Bob.foo;
fn(); // window NOT Bob

То, что вы делаете в случае:

$j('#MyButton').click( Bob.doSomething );

, похоже на последний пример с fn : вы вызываете функцию doSomething от Боба и передает его установщику обработчика событий jQuery как чистую функцию: он больше не имеет связи с Бобом или каким-либо другим объектом, поэтому вместо этого JavaScript передает глобальный объект window . (Это одна из худших особенностей дизайна JavaScript, так как вы можете не сразу заметить, что window не Bob , и начать доступ к его свойствам, вызывая странные и сбивающие с толку взаимодействия и ошибки.)

Чтобы запомнить Боба, вы обычно создаете функцию, как в ответе Никита, чтобы сохранить копию «Боб» в замыкании, чтобы ее можно было запомнить в время обратного вызова и используется для вызова реального метода. Однако теперь есть стандартизированный способ сделать это в ECMAScript Fifth Edition:

$j('#MyButton').click( Bob.doSomething.bind(Bob) );

(Вы также можете добавить дополнительные аргументы в вызов bind , чтобы вызвать doSomething обратно с ними, то есть удобно.)

Для браузеров, которые еще не поддерживают метод bind () пятой редакции изначально (а на данный момент их большинство), вы можете взломать свою собственную реализацию bind ( библиотека прототипов также делает это), что-то вроде:

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

Две причины не использовать отладчик включают:

  • На клиентской машине не установлен отладчик, в котором произошла ошибка происходит
  • Вы не можете позволить себе остановить (живой) процесс (на клиентской машине), чтобы проверить его с помощью отладчика

Я не знаю, "такой ли я программист", но я не не вижу, что вам нужно от отладчика, кроме: Затем я бы использовал класс ImageCollection для хранения этих методов. Классическая инкапсуляция.

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

class Product {
    private readonly Collection<Image> _images;
    public Product() { _images = new Collection<Image>(); }
    public Collection<Image> Images { get { return _images; } }
}

-Oisin

5
ответ дан 2 December 2019 в 04:25
поделиться
Другие вопросы по тегам:

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