Передайте объект, унаследуйте его или используйте прямой метод - PullRequest
3 голосов
/ 11 марта 2012

Я новичок в C # и сценарии ООП и в процессе создания инфраструктуры, которая поможет мне лучше понять концепции ООП. Это проект, который я сделал, чтобы проверить свои знания в классе. Может кто-то пройти через это и объяснить мне, что было бы лучше и почему?

В моей программе на C # есть объекты:

  • deskClerk [имеет метод addCustomer, который возвращает объект Customer.]
  • Заказать
  • 1010 * Фото *
  • Клиент
  • Полезность
  • Showroom [Содержит списки клиентов, акций и заказов - все списки частный. В автосалоне также есть метод addCustomer]

Я хочу, чтобы объект deskClerk добавил Customer в объект Showroom. Для этого у меня есть следующие варианты:

  1. Я могу передать объект Showroom в deskClerk, а затем использовать Метод addCustomer внутри Showroom для добавления клиента.
  2. Я могу напрямую добавить Customer в Showroom, так как объект Showroom уже имеет метод addCustomer.
  3. Я могу унаследовать объект deskClerk от Showroom, и в этом случае DeskClerk сможет добавить в список клиентов, используя addCustomer метод выставочного зала.

Мои вопросы:

  • Какой из трех вариантов выбора имеет звуковую логику?
  • Должен ли выставочный зал иметь метод addCustomer? Выставочный зал должен быть только объектом хранения для списков "Склад", "Заказчик" и "Заказ", верно?

Ответы [ 2 ]

1 голос
/ 11 марта 2012

Мне нравится ваш подход к проблеме.Читайте ваши вопросы:

  • Каждый из этих вариантов имеет логическую логику, поэтому ваш выбор зависит от
    , как вы хотите структурировать свои объекты и как вы хотите их использовать.Как программист, я рекомендую вам использовать второй или третий.

  • Да, в выставочном зале может быть метод addCostumer, и в этом случае, если вы хотите использовать второй или третий вариант, он должен иметь метод addCostumer, если вы хотите добавить Costumer.в хранилище.

Используя третий вариант, вот мой пример кода:

class Stock { /*...*/ }
class Customer { /*...*/  }
class Order { /*...*/  }

class Showroom
{
    protected List<Stock> StockList;
    protected List<Customer> CustomerList;
    protected List<Order> OrderList;

    public Showroom()
    {
        StockList = new List<Stock>();
        CustomerList = new List<Customer>();
        OrderList = new List<Order>();
    }

    public virtual void addStock(Stock stock)
    {
        StockList.Add(stock);
    }

    public virtual void addCustomer(Customer customer)
    {
        CustomerList.Add(customer);
    }

    public virtual void addOrder(Order order)
    {
        OrderList.Add(order);
    }

    //...
}

class deskClerk : Showroom
{
    public deskClerk()
    {
        CustomerList = new List<Customer>();
    }

    public override void addCustomer(Customer customer)
    {
        CustomerList.Add(customer);
    }

    //...
}

Так что я могу порекомендовать вам еще одну вещь:

Каждыйвремя, когда вы будете работать с объектами, даст каждому его роль и его задачи, и тогда каждый выбор зависит от логики, которую вы хотите использовать.Выберите тот, который, по вашему мнению, будет работать и хорошо вписывается в контекст, в котором вы хотите его использовать.

1 голос
/ 11 марта 2012

Вы должны выяснить, может ли Клиент существовать, не будучи частью в Выставочном зале, и может ли DeskClerk плавать без участия в Выставочном зале.

Если это сценарий, я бы сделал что-то вродеthis

public class Showroom {
    public DeskClerk Clerk { get; private set; }
    public List<Customer> Customers { get; set; }
    [...]
}

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

public class DeskClerk {
    private ShowRoom { get; set; }
    public DeskClerk(ShowRoom showRoom) {
        ShowRoom = showRoom;
    }
    public Customer AddCustomer(Customer customer) {
        //do stuff with customer object
        ShowRoom.Add(customer);
        return cutomer;
    }
}

Не думаю, что это будетПравильно иметь 2 места для добавления клиентов, но DeskClerk должен все же нести ответственность за это.

Однако, возможно, вы неправильно поняли вашу проблему :-) Надеюсь, это поможет!

...