Лучший Тип для установки как тип возврата для методов, которые возвращают набор?

-1 для типичного истеричного ‘use [моя любимая система шаблонной обработки] вместо этого! Сообщения ’. Каждое сообщение PHP, даже если собственный ответ PHP является остротой, всегда ухудшается в это, так же, как каждая острота, вопрос о JavaScript заканчивается полный ‘use [моя любимая платформа] вместо этого! ’. Неловко.

Серьезно, мы знаем о разделении проблемы представления и бизнес-логика. Можно сделать, that —  or не делают that —  in любая система шаблонной обработки, ли PHP, Присяжный острослов или что-то совершенно другое. Никакая система шаблонной обработки волшебно не разделяет Ваши проблемы без набора взглядов.

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

Для ответа на вопрос, который задали первый пример в порядке, но очень трудный читать из-за плохого добавления отступа. См. пример monzee для более читаемого пути; можно использовать: нотация или {} s, какой бы ни Вы предпочитаете, но важная вещь для удобочитаемости состоит в том, чтобы сохранить Ваш HTML и PHP как сингл, ‘well-formed’ расположенная с отступом иерархия.

И заключительная просьба: помните htmlspecialchars (). Каждый раз, когда простой текст должен войти к веб-странице, это должно использоваться, или это - XSS на всем протяжении пола. Я знаю, что этот вопрос непосредственно не связан с этим, но каждый раз, когда мы отправляем пример кода включая <? эхо php ($title)?> или платформа, эквивалентная без выхода, мы поощряем продолжение зоны бедствия безопасности, которой стало большинство приложений PHP.

11
задан Nate 20 October 2009 в 19:58
поделиться

6 ответов

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.

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

The Framework Design Guidelines state:

Use Collection or a subclass of Collection for properties or return values representing read/write collections.

public Collection Sessions { get; }

Use ReadOnlyCollection, a subclass of ReadOnlyCollection, or in rare cases IEnumerable 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 или язык, который не поддержите его.

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

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<>

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

Если коллекция неупорядочена или не требует произвольного доступа, IEnumerable верен. Если это список, и вы хотите представить его как один, то объявите метод или свойство для возврата IList, но вам вполне может потребоваться вернуть оболочку ReadOnlyCollection над этой коллекцией (либо напрямую, либо с использованием синтаксиса, такого как List.AsReadOnly ()) . Я бы вернул IQueryable только в том случае, если бы у меня было несколько полезных переопределений.

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

При написании приложений я не вижу проблем с возвратом определенного универсального типа, например:

List<myType> MyMethod()
{
  ...
}

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

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

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

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.

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