-1 для типичного истеричного вЂuse [моя любимая система шаблонной обработки] вместо этого! Сообщения ’. Каждое сообщение PHP, даже если собственный ответ PHP является остротой, всегда ухудшается в это, так же, как каждая острота, вопрос о JavaScript заканчивается полный вЂuse [моя любимая платформа] вместо этого! ’. Неловко.
Серьезно, мы знаем о разделении проблемы представления и бизнес-логика. Можно сделать, that —  or не делают that —  in любая система шаблонной обработки, ли PHP, Присяжный острослов или что-то совершенно другое. Никакая система шаблонной обработки волшебно не разделяет Ваши проблемы без набора взглядов.
(На самом деле система шаблонной обработки, которая слишком строга, может закончиться с Вами имеющий необходимость записать вспомогательный код, который чисто представляем, загромождая Вашу бизнес-логику с представляемыми проблемами. Это не победа!)
Для ответа на вопрос, который задали первый пример в порядке, но очень трудный читать из-за плохого добавления отступа. См. пример monzee для более читаемого пути; можно использовать: нотация или {} s, какой бы ни Вы предпочитаете, но важная вещь для удобочитаемости состоит в том, чтобы сохранить Ваш HTML и PHP как сингл, вЂwell-formed’ расположенная с отступом иерархия.
И заключительная просьба: помните htmlspecialchars (). Каждый раз, когда простой текст должен войти к веб-странице, это должно использоваться, или это - XSS на всем протяжении пола. Я знаю, что этот вопрос непосредственно не связан с этим, но каждый раз, когда мы отправляем пример кода включая <? эхо php ($title)?> или платформа, эквивалентная без выхода, мы поощряем продолжение зоны бедствия безопасности, которой стало большинство приложений PHP.
I default to IEnumerable. I'm shooting for the minimal interface to expose. Both IList
and IQueryable
implement IEnumerable
. So unless you have other specific requirements for the methods I'd go for minimalism and use the least derived type. If you have other requirements in your calling code, such as performance of indexed lookups or getting the number of items in the collection then you might want to choose another type such as ICollection
.
The Framework Design Guidelines state:
Use
Collection
or a subclass ofCollection
for properties or return values representing read/write collections.public Collection
Sessions { get; } Use
ReadOnlyCollection
, a subclass ofReadOnlyCollection
, or in rare casesIEnumerable
for properties or return values representing read-only collections.public ReadOnlyCollection
Sessions { get; } In general, prefer
ReadOnlyCollection
.
Что касается LINQ, рекомендации, которые были созданы для .NET 3.5, ясны, но не (imo) полностью убедительны в обосновании:
Орган проверки сделал явное решение, что LINQ не следует изменять это руководство ["Не возвращать
IEnumerator
, кроме как возвращаемый типGetEnumerator
метод "]. Ваш абоненты могут оказаться неуклюжими объектная модель, если они решат не использовать LINQ или язык, который не поддержите его.
Use the least general Type that all possible return types will conform to. i.e, if the method you are looking at might return a List
or an int[]
, then I'd type as IEnumerable
... If it could return List
or a List
or an int[]
I'd type as IEnumerable
. If it always returned either a Collection
or a Collection
then return Collection
If the method will always generate the same type, use that type...
In a consuming method or interface, otoh, where the returned object is being used, you should use the opposite philosophy, Type the incoming method parameter as the least general type that is required by the internal functionality of the code in the consuming method... i.e, if all the method does with the collection object is enumerate through it using foreach
, then the incoming parameter type should IEnumerable<>
Если коллекция неупорядочена или не требует произвольного доступа, IEnumerable верен. Если это список, и вы хотите представить его как один, то объявите метод или свойство для возврата IList, но вам вполне может потребоваться вернуть оболочку ReadOnlyCollection над этой коллекцией (либо напрямую, либо с использованием синтаксиса, такого как List.AsReadOnly ()) . Я бы вернул IQueryable только в том случае, если бы у меня было несколько полезных переопределений.
При написании приложений я не вижу проблем с возвратом определенного универсального типа, например:
List<myType> MyMethod()
{
...
}
По моему опыту, это легко для исходного разработчика , и другим разработчикам легко понять, что задумал исходный разработчик.
Но если вы разрабатываете какой-то каркас, который будет использоваться другими разработчиками, вы можете захотеть быть более сложным - например, вернуть интерфейс.
It ultimately depends on what you want to do with the data being returned. Remember that IEnumerable implies (by that I mean forces) you to access the data in a sequential manner. You can't add to it, alter it, and you can't access an item at a specific point in the array.
IList doesn't have this problem, but you have to provide additional functionality to implement it. If you inherit from a .net object, you might not have to worry about it, but it really depends on how you are creating the object.
Each have their trade offs and there is no one to always default to.