Здравствуйте, madlax, Вы писали: M>например, добавляю класс CDDisk, придётся добавить CDDiskDeck?
Ни в коем случае.
Попытка применить это правило приведет к взрыву системы типов: в самом деле, как только вы добавите CDDiskDeck, правило сработает снова и придется добавлять CDDiskDeckShell, и так далее.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, madlax, Вы писали: M>что, на мой взгляд, стандартных template / generic контейнеров не достаточно, чтобы построить систему M>стандартные контейнеры позволяют организовать только структуру
Да ну? M>например, требуется вывести названия всех дисков в контейнере,
Куда вывести? M>или выбрать все диски конкретного исполнителя M>какой класс отвечает за это?
System.Linq.Enumerable.
using System;
using System.Linq;
using System.Collections.Generic;
namespace TestContainersCS
{
class Program
{
static void Main(string[] args)
{
List<Disk> diskBox = new List<Disk>{
new Disk { Title = "Muster of Puppets", Author = "Metallica" },
new Disk { Title = "...And Justice for All", Author = "Metallica" },
new Disk { Title = "Draconian Times", Author = "Paradise Lost" },
};
diskBox.ConvertAll(d => string.Format("{0}, {1}", d.Title, d.Author)).ConsoleWrite();
(from d in diskBox where d.Author == "Metallica"select d.Title).ConsoleWrite();
}
private class Disk
{
public string Title { get; set; }
public string Author { get; set; }
}
}
public static class CollectionHelper
{
public static void ConsoleWrite<T>(this IEnumerable<T> source)
{
source.ForEach(i => Console.WriteLine(i));
}
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
foreach (T t in source)
action(t);
}
}
}
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
что, на мой взгляд, стандартных template / generic контейнеров не достаточно, чтобы построить систему
стандартные контейнеры позволяют организовать только структуру
например, требуется вывести названия всех дисков в контейнере, или выбрать все диски конкретного исполнителя
какой класс отвечает за это?
madlax пишет: > > например, требуется вывести названия всех дисков в контейнере, или > выбрать все диски конкретного исполнителя > какой класс отвечает за это?
ты считаешь, что Disk обладает интерфейсом, представляющим его в строковом виде
это возможно в конкретном случае, но в общем случае нет
кроме того, это раскрывает инкапсуляцию диска
что если автор — это не строка, а экземпляр класса Author?
M>что, на мой взгляд, стандартных template / generic контейнеров не достаточно, чтобы построить систему
M>стандартные контейнеры позволяют организовать только структуру
Да ну?
обрати внимание, у тебя есть контейнер List<Disk>
сам по себе он даёт только структуру
а чтобы использовать его, ты неявно дописываешь 2 метода:
один для вывода названий:
(from d in diskBox where d.Author == "Metallica"select d.Title).ConsoleWrite();
почему неявно:
в конкретном случае эти методы выглядят достаточно просто,
в более сложном случае при повторном использовании в другой части программы
их придётся выделить в отдельные методы
но самое важное, что ты предполагаешь использование списка дисков только в классе Program,
при описании списка дисков в нескольких классах, например, коллекция дисков у пользователя (класс User) и полка дисков онлайн магазина (класс Shelf),
(обрати внимание, и там, и там требуется только вывести названия дисков и выбрать диски конкретного исполнителя)
появится дублирование кода
в целом очень хорошо написано, но если распишешь для User и Shelf, появится класс DiskDeck как контейнер класса Disk )
и ещё момент, там в вопросе есть оговорка, что экземпляры класса предполагается использовать анонимно,
это значит, что есть объекты не имеющие имени
так вот если в программе предполагается каждому объекту класса DiskDeck присваивать имя,
то необходимости в DiskDeckShell не возникает
Здравствуйте, madlax, Вы писали:
M>ты считаешь, что Disk обладает интерфейсом, представляющим его в строковом виде M>это возможно в конкретном случае, но в общем случае нет M>кроме того, это раскрывает инкапсуляцию диска M>что если автор — это не строка, а экземпляр класса Author?
И что? Какая разница?
M>обрати внимание, у тебя есть контейнер List<Disk> M>сам по себе он даёт только структуру
M>а чтобы использовать его, ты неявно дописываешь 2 метода: M>один для вывода названий: M>
M>(from d in diskBox where d.Author == "Metallica"select d.Title).ConsoleWrite();
M>
M>почему неявно: M>в конкретном случае эти методы выглядят достаточно просто, M>в более сложном случае при повторном использовании в другой части программы M>их придётся выделить в отдельные методы
Придется — значит выделим. Только, наверное, более правильно будет выделить их в классе Disk:
public override string ToString() {...}
public bool IsAuthorEqual(string authorName)
Это обеспечит независимость предикатов от деталей реализации. M>но самое важное, что ты предполагаешь использование списка дисков только в классе Program,
Нет. M>при описании списка дисков в нескольких классах, например, коллекция дисков у пользователя (класс User) и полка дисков онлайн магазина (класс Shelf), M>(обрати внимание, и там, и там требуется только вывести названия дисков и выбрать диски конкретного исполнителя) M>появится дублирование кода
Заранее ты все запросы к коллекциям не предусмотришь. Сие есть медицинский факт, и лучше с ним смириться, чем пытаться натужно рожать классы коллекций, да еще и заранее. M>в целом очень хорошо написано, но если распишешь для User и Shelf, появится класс DiskDeck как контейнер класса Disk )
Очень вряд ли. Я наоборот, постараюсь скрыть такие детали от клиентов классов User и Shelf:
public class DiskShelf
{
...
publicIEnumerable<Disk> Disks { get;}
}
Вот смотри: чем отличается то, что ты предлагаешь:
IEnumerable<Disk> metallica;
metallica = Shelf.Disks.SelectDisksByAuthor("Metallica"); // твой вариант со спец.методом в спец.классе.
metallica = Shelf.Disks.Where(d => d.IsAuthorEqual("Metallica"); // мой вариант
Велика ли экономия?
M>и ещё момент, там в вопросе есть оговорка, что экземпляры класса предполагается использовать анонимно, M>это значит, что есть объекты не имеющие имени
Я не уверен, что правильно понял, что такое "не имеющие имени". Если имеется в виду, что нет прямых ссылок на экземпляр — то всё равно нет необходимости придумывать собственные коллекции. M>так вот если в программе предполагается каждому объекту класса DiskDeck присваивать имя, M>то необходимости в DiskDeckShell не возникает
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
M>>появится дублирование кода S>Заранее ты все запросы к коллекциям не предусмотришь. Сие есть медицинский факт, и лучше с ним смириться, чем пытаться натужно рожать классы коллекций, да еще и заранее.
Кстати, безотносительно дискуссии... В Linq есть CompiledQuery, с помощью которого предлагают делать что-то типа библиотеки запросов для reuse
И начальник заставы поймет меня, и беспечный рыбак простит