Если я включаю список сборов/скидок в класс порядка или сделал, чтобы они были itemlines

Вы можете попытаться заменить кавычку на php

$nomeCantiere = 

Вы можете попытаться заменить кавычку на php

[110]

, если вместо двух mysql вставить 2 кавычки (''), это значение будет помещено в таблицу только с 1 кавычкой

POST["nomeCantiere"]; str_replace("'", "''", $nomeCantiere );

, если вместо двух mysql вставить 2 кавычки (''), это значение будет помещено в таблицу только с 1 кавычкой

7
задан Steven Evers 28 April 2009 в 17:13
поделиться

4 ответа

Я укажу на замечание Роба Коннери на подкасте ALT.net, которое я слушал не так давно (я не сторонник ALT.net, но рассуждения казались обоснованными) :

Что имеет смысл для «бизнес-пользователя» (если у вас есть кто-то из этого).

Как программист, вы захотите учесть Item, Fee, Discount и т. Д., Потому что они похожи атрибуты и поведение.

НО, это могут быть две совершенно разные концепции в терминах модели. И кто-то придет позже, сказав: «но это не имеет смысла, это разные вещи, мне нужно сообщать о них отдельно, и мне нужно применить это конкретное правило к скидкам в этом случае».

DRY делает Это не значит ограничивать вашу модель, и вы должны помнить об этом, когда учитываете поведение с помощью наследования или чего-то подобного.

Конкретным примером, который использовался в этом случае, был пример корзины покупок. Естественная идея программиста состояла в том, чтобы использовать заказ в непринужденном состоянии. И это имеет смысл, потому что они выглядят точно так же. За исключением того, что они не являются. Это не имеет смысла для клиента, потому что это две разные концепции, и это только делает дизайн менее понятным.

Это вопрос практики, вкуса и мнения, поэтому не следует слепо следовать советам, размещенным в сети. site:)

Что касается вашей конкретной проблемы, система, с которой я работаю, использует товары, сборы, скидку на отдельные позиции (свойство товара) и глобальную скидку на заказ (хотя это не заказ, а POS-квитанция). но в данном случае это не имеет большого значения).

Я полагаю, причина в том, что за этими понятиями Предметы являются конкретными примерами инвентаризованных изделий, они влияют на объемы запасов, они подсчитываются и поддаются количественной оценке.

Сборы не являются , Они не разделяют большинство атрибутов.

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

3
ответ дан 7 December 2019 в 03:20
поделиться

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

Тарифы могут быть связаны с проверочным поведением, связанным с ними. Допустим, вы добавляете комиссию к любому Ордену, который имеет 20 или более предметов (просто случайный пример, запустите со мной этот). Теперь, когда вы добавляете 20-й предмет, вы можете добавить этот сбор в Орден, но есть проблема; Когда вы удаляете товар из вашего заказа, хотите ли вы каждый раз проверять, нужно ли вам удалять этот сбор из вашего заказа? Я сомневаюсь в этом; здесь подразумевается, что есть поведение, связанное с комиссионными / скидками, которое, по сути, делает их совершенно другим классом вещей.

Я бы посмотрел на это так; классифицируйте Комиссионные и Скидки как «Особые» вещи, а затем создайте интерфейс «ISpecial», от которого наследуются и Комиссионные, и Скидки. Извлеките любую общую функциональность в интерфейс ISpecial (например, «Validate»). Затем сделайте так, чтобы ваш Order реализовал интерфейс ISpecial (или любой другой).

Таким образом, вы можете определить конкретное поведение Fee.Validate () и поведение Discount.Validate, и работать правильно благодаря магии полиморфизма ( foreach of m_specialCollection. проверить эти). Таким образом, вы также можете легко расширить интерфейс Special для всего, что может понадобиться (скажем,

3
ответ дан 7 December 2019 в 03:20
поделиться

Одним из вариантов является добавление атрибута ItemType в OrderItem

enum ItemType
{
   Item,
   Fee,
   Discount
}

Теперь вы можете в своем классе заказа иметь:

public IList<OrderItem> Fees
{
   get
   {
      return _items.Find(i=>i.ItemType==ItemType.Fee);
   }
}

Теперь вы все еще можете хранить свой единственный список и избегать дополнительных интерфейсов. Вы могли бы даже иметь метод, подобный IList GetItems (тип ItemType).

Еще одна мысль - ваш текущий дизайн не допускает скидку в%. Сегодня вы получаете скидку 10%. Это может быть не обязательным требованием, но один из способов избежать необходимости расчета приложением этого кода - отделить товары от скидок.

Скидки могут даже стать правилом, если я закажу 10 товаров и получу скидку 5%.

1
ответ дан 7 December 2019 в 03:20
поделиться

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

Учитывая то, что вы описываете, вот как я бы попытался реализовать это:

Создать класс Order , который реализует публичные свойства для каждого из них. элемент данных, который вы хотите отобразить для привязки данных: номер заказа, дата, клиент, общие сборы, общие скидки и т. д. Похоже, вам может потребоваться отобразить определенные сборы / скидки в виде отдельных значений ; если так, реализуйте публичные свойства для тех.

Создайте абстрактный класс OrderItem , который реализует общедоступные свойства для каждого элемента данных, с которым вы хотите связать сетку, и для каждого элемента данных, с которым вы хотите отсортировать элементы. (Вы также можете сделать это интерфейсом IOrderItem ; это действительно зависит от того, будут ли методы, общие для всех элементов заказа.)

Создание подклассов OrderItem ( или классы, которые реализуют IOrderItem ) для определенных типов позиций, которые могут появляться в заказе: ProductOrderItem , FeeOrderItem , DiscountOrderItem , и т. д.

В вашей реализации ProductItem реализуйте свойство типа Item - это будет выглядеть примерно так:

public class ProductItem : OrderItem
{
   public Item Item { get; set; }
   public string Description { get { return Item.Description; } }
   public int Quantity { get; set; }
   public decimal Amount { get { return Item.Price * Quantity; } }
}

Реализовать свойство типа IEnumerable в Order для хранения всех позиций. Реализуйте метод AddItem для добавления OrderItems , например:

public void AddItem(OrderItem item)
{
   _Items.Add(item); // note that backing field is a List<OrderItem>
}

, который вы можете вызвать довольно просто:

Order o = new Order();
o.AddItem(new ProductOrderItem { Item = GetItem(1), Quantity = 2 });
o.AddItem(new FeeItem { Description = "Special Fee", Amount = 100 });
o.AddItem(new DiscountItem { DiscountAmount = .05 });

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

public decimal TotalFees
{
   get
   {
      return (from OrderItem item in Items
              where item is FeeItem
              select item.Amount).Sum();
   }
}

Вы можете вернуться позже и при необходимости оптимизировать эти свойства (например, сохранить вычисления, как только вы сделали это один раз).

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

public void SetDiscountAmount(decimal discountAmount)
{
   DiscountOrderItem item = _Items
      .Where(x => x is DiscountOrderItem)
      .SingleOrDefault();
   if (item == null)
   {
       item = new DiscountOrderItem();
       _Items.Add(item);
   }
   item.DiscountAmount = discountAmount;
}

Вы ' d используйте этот подход, если вы хотите отобразить сумму скидки в соответствующем месте в таблице позиций заказа, но также хотите, чтобы сумма скидки для заказа составляла одно значение. (Можно утверждать, что вы можете захотеть сделать DiscountAmount свойством Order , создать DiscountOrderItem в его установщике и иметь DiscountOrderItem получить его сумму из Order.DiscountAmount . Я думаю, что оба подхода имеют свои плюсы и минусы.)

и получить DiscountOrderItem для получения его Amount из Order.DiscountAmount . Я думаю, что оба подхода имеют свои плюсы и минусы.)

и получить DiscountOrderItem для получения его Amount из Order.DiscountAmount . Я думаю, что оба подхода имеют свои плюсы и минусы.)

2
ответ дан 7 December 2019 в 03:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: