Я всегда использую < dl> для часто задаваемых вопросов. Обычно делая < dt> привязка для индекса вопросов связаться.
редактирование...
я должен упомянуть, это - моя интерпретация самого семантического подхода. Поскольку я вижу его, это - точно вид вещи < dl> предназначен для повышения.
Что касается CSS, это действительно субъективно. Я делаю типичные стили выхода заголовка для < dt> с высокой насыщенностью шрифта, возможно, немного более высокий размер шрифта и возможно большая буква/межсловный интервал.
Независимо от того, что интегрируется хорошо с остальной частью Вашего зрительного ряда на сайте и делает отношения между вопросом и сразу отвечают очевидный....
В общем, лучше всего открыть один из интерфейсов, например IEnumerable
, ICollection
или IList
вместо конкретного класса.
Это дает вам гораздо больше гибкости с точки зрения изменения внутреннего API. IEnumerable
, в частности, позволяет вам потенциально изменять ваши внутренние компоненты позже, чтобы разрешить потоковую передачу результатов, поэтому он наиболее гибкий.
Если вы знаете ожидаемые шаблоны использования ваших «коллекций», вы должен предоставить соответствующий API, который в будущем будет минимально ограничивать вас. Если, например, вы знаете, что людям просто нужно повторить ваши результаты, выставьте IEnumerable
, чтобы вы могли позже перейти на ЛЮБУЮ коллекцию или даже просто переключиться на использование yield return напрямую.
Если вы знаете ожидаемые шаблоны использования ваших «коллекций», вы должны предоставить соответствующий API, который будет обеспечивать наименьшие ограничения для вас в будущем. Если, например, вы знаете, что людям просто нужно повторить ваши результаты, выставьте IEnumerable
, чтобы вы могли позже перейти на ЛЮБУЮ коллекцию или даже просто переключиться на использование yield return напрямую.
Если вы знаете ожидаемые шаблоны использования ваших «коллекций», вы должны предоставить соответствующий API, который будет обеспечивать наименьшие ограничения для вас в будущем. Если, например, вы знаете, что людям просто нужно повторить ваши результаты, выставьте IEnumerable
, чтобы вы могли позже перейти на ЛЮБУЮ коллекцию или даже просто переключиться на использование yield return напрямую.
Я бы выбрал второй. Код клиента в любом случае должен знать тип изображения.
Первый означает только больше кода.
Если вы создаете общедоступный API, рассмотрите возможность использования пользовательской коллекции, чтобы получить следующие преимущества:
Расширяемость - вы можете добавлять функции в свою пользовательскую коллекцию в будущем, не меняя API.
Обратная совместимость - вы можете изменять внутреннее устройство вашего класса коллекции по своему усмотрению, не нарушая существующий код, который клиенты запрограммировали для коллекции.
Также проще вносить потенциально критические изменения с меньшим воздействием. Возможно, позже вы решите, что не хотите, чтобы это была Collection
, а другой тип коллекции - вы можете настроить свой класс ImageCollection
так, чтобы он имел те же методы, что и раньше, но унаследовать от чего-то другого - и клиентский код вряд ли сломается.
Если это ' s только для кода внутреннего использования, решение не обязательно так важно, и вы можете решить пойти с «проще - лучше».
Примером, который мне не нравится, является API ArcGIS Server от ESRI - они используют пользовательские коллекции в своих API. В основном по этим причинам мы также используем пользовательские коллекции в наших API.
Единственная причина использовать Collection
- это если вы хотите подключиться к набору виртуальных методов, который позволяет вам видеть все мутации базовых список. Это позволяет вам выполнять такие операции, как реагировать на удаления, реализовывать события и т. Д.
Если вам не интересно отвечать или наблюдать за этими изменениями коллекции, то List
является более подходящим тип.
Это не ошибка 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
( библиотека прототипов также делает это), что-то вроде:
Две причины не использовать отладчик включают:
Я не знаю, "такой ли я программист", но я не не вижу, что вам нужно от отладчика, кроме: Затем я бы использовал класс ImageCollection для хранения этих методов. Классическая инкапсуляция.
Кроме того, в стороне, вам действительно следует предоставлять только геттер для этой коллекции и инициализировать поле поддержки только для чтения с фактической коллекцией. Вероятно, вы хотите, чтобы люди добавляли / удаляли элементы из коллекции, а не заменяли все:
class Product {
private readonly Collection<Image> _images;
public Product() { _images = new Collection<Image>(); }
public Collection<Image> Images { get { return _images; } }
}
-Oisin