для каждого класса нужно уточнять контейнер?
От: madlax  
Дата: 07.10.07 11:30
Оценка:
правда ли,

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

то нужно обязательно добавить ещё один класс ItemContainer,
который будет служить контейнером для экземпляров нового класса?

например, добавляю класс CDDisk, придётся добавить CDDiskDeck?

09.10.07 19:50: Перенесено модератором из 'Философия программирования' — AndrewVK
Re: для каждого класса нужно уточнять контейнер?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 07.10.07 11:43
Оценка: +3
Здравствуйте, madlax, Вы писали:

M>например, добавляю класс CDDisk, придётся добавить CDDiskDeck?


В современных языках есть шаблоны и generic'и, которые позволяют сохранить строгую статическую типизацию без добавления нового класса контейнера.
Re: для каждого класса нужно уточнять контейнер?
От: deniok Россия  
Дата: 07.10.07 12:48
Оценка:
Здравствуйте, madlax, Вы писали:

M>правда ли,


M>[skiped]


Нет, неправда. Если язык поддерживает концепцию полиморфных типов, то полиморфные контейнеры спасают от этих забот.
Re: для каждого класса нужно уточнять контейнер?
От: Sinclair Россия https://github.com/evilguest/
Дата: 08.10.07 05:02
Оценка: +1
Здравствуйте, madlax, Вы писали:
M>например, добавляю класс CDDisk, придётся добавить CDDiskDeck?
Ни в коем случае.
Попытка применить это правило приведет к взрыву системы типов: в самом деле, как только вы добавите CDDiskDeck, правило сработает снова и придется добавлять CDDiskDeckShell, и так далее.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: вопрос требует уточнения
От: madlax  
Дата: 08.10.07 07:08
Оценка:
в вопросе я имею в виду то,

что, на мой взгляд, стандартных template / generic контейнеров не достаточно, чтобы построить систему
стандартные контейнеры позволяют организовать только структуру

например, требуется вывести названия всех дисков в контейнере, или выбрать все диски конкретного исполнителя
какой класс отвечает за это?
Re[3]: вопрос требует уточнения
От: ArtDenis Россия  
Дата: 08.10.07 10:18
Оценка:
madlax пишет:
>
> например, требуется вывести названия всех дисков в контейнере, или
> выбрать все диски конкретного исполнителя
> какой класс отвечает за это?

DbEngine

Шучу
Posted via RSDN NNTP Server 2.1 beta
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: вопрос требует уточнения
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.10.07 04:32
Оценка: +1
Здравствуйте, 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>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: сразу появляется ряд проблем )
От: madlax  
Дата: 09.10.07 17:59
Оценка:
ты считаешь, что Disk обладает интерфейсом, представляющим его в строковом виде
это возможно в конкретном случае, но в общем случае нет
кроме того, это раскрывает инкапсуляцию диска
что если автор — это не строка, а экземпляр класса Author?

M>что, на мой взгляд, стандартных template / generic контейнеров не достаточно, чтобы построить систему
M>стандартные контейнеры позволяют организовать только структуру
Да ну?


обрати внимание, у тебя есть контейнер List<Disk>
сам по себе он даёт только структуру

а чтобы использовать его, ты неявно дописываешь 2 метода:
один для вывода названий:
diskBox.ConvertAll(d => string.Format("{0}, {1}", d.Title, d.Author)).ConsoleWrite();

второй для выбора дисков по автору:
(from d in diskBox where d.Author == "Metallica" select d.Title).ConsoleWrite();


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

но самое важное, что ты предполагаешь использование списка дисков только в классе Program,
при описании списка дисков в нескольких классах, например, коллекция дисков у пользователя (класс User) и полка дисков онлайн магазина (класс Shelf),
(обрати внимание, и там, и там требуется только вывести названия дисков и выбрать диски конкретного исполнителя)
появится дублирование кода

в целом очень хорошо написано, но если распишешь для User и Shelf, появится класс DiskDeck как контейнер класса Disk )

и ещё момент, там в вопросе есть оговорка, что экземпляры класса предполагается использовать анонимно,
это значит, что есть объекты не имеющие имени

так вот если в программе предполагается каждому объекту класса DiskDeck присваивать имя,
то необходимости в DiskDeckShell не возникает
Re[5]: сразу появляется ряд проблем )
От: Sinclair Россия https://github.com/evilguest/
Дата: 10.10.07 05:02
Оценка:
Здравствуйте, madlax, Вы писали:

M>ты считаешь, что Disk обладает интерфейсом, представляющим его в строковом виде

M>это возможно в конкретном случае, но в общем случае нет
M>кроме того, это раскрывает инкапсуляцию диска
M>что если автор — это не строка, а экземпляр класса Author?
И что? Какая разница?

M>обрати внимание, у тебя есть контейнер List<Disk>

M>сам по себе он даёт только структуру

M>а чтобы использовать его, ты неявно дописываешь 2 метода:

M>один для вывода названий:
M>
M>diskBox.ConvertAll(d => string.Format("{0}, {1}", d.Title, d.Author)).ConsoleWrite();
M>

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
{
  ...
    public IEnumerable<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>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: сразу появляется ряд проблем )
От: Gollum Россия  
Дата: 29.10.07 15:49
Оценка:
Здравствуйте, Sinclair, Вы писали:

M>>появится дублирование кода

S>Заранее ты все запросы к коллекциям не предусмотришь. Сие есть медицинский факт, и лучше с ним смириться, чем пытаться натужно рожать классы коллекций, да еще и заранее.

Кстати, безотносительно дискуссии... В Linq есть CompiledQuery, с помощью которого предлагают делать что-то типа библиотеки запросов для reuse
И начальник заставы поймет меня, и беспечный рыбак простит
Eugene Agafonov on the .NET

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.