Вы можете попытаться заменить кавычку на php
$nomeCantiere = Вы можете попытаться заменить кавычку на php
[110] , если вместо двух mysql вставить 2 кавычки (''), это значение будет помещено в таблицу только с 1 кавычкой
POST["nomeCantiere"];
str_replace("'", "''", $nomeCantiere );
, если вместо двух mysql вставить 2 кавычки (''), это значение будет помещено в таблицу только с 1 кавычкой
Я укажу на замечание Роба Коннери на подкасте ALT.net, которое я слушал не так давно (я не сторонник ALT.net, но рассуждения казались обоснованными) :
Что имеет смысл для «бизнес-пользователя» (если у вас есть кто-то из этого).
Как программист, вы захотите учесть Item, Fee, Discount и т. Д., Потому что они похожи атрибуты и поведение.
НО, это могут быть две совершенно разные концепции в терминах модели. И кто-то придет позже, сказав: «но это не имеет смысла, это разные вещи, мне нужно сообщать о них отдельно, и мне нужно применить это конкретное правило к скидкам в этом случае».
DRY делает Это не значит ограничивать вашу модель, и вы должны помнить об этом, когда учитываете поведение с помощью наследования или чего-то подобного.
Конкретным примером, который использовался в этом случае, был пример корзины покупок. Естественная идея программиста состояла в том, чтобы использовать заказ в непринужденном состоянии. И это имеет смысл, потому что они выглядят точно так же. За исключением того, что они не являются. Это не имеет смысла для клиента, потому что это две разные концепции, и это только делает дизайн менее понятным.
Это вопрос практики, вкуса и мнения, поэтому не следует слепо следовать советам, размещенным в сети. site:)
Что касается вашей конкретной проблемы, система, с которой я работаю, использует товары, сборы, скидку на отдельные позиции (свойство товара) и глобальную скидку на заказ (хотя это не заказ, а POS-квитанция). но в данном случае это не имеет большого значения).
Я полагаю, причина в том, что за этими понятиями Предметы являются конкретными примерами инвентаризованных изделий, они влияют на объемы запасов, они подсчитываются и поддаются количественной оценке.
Сборы не являются , Они не разделяют большинство атрибутов.
Это может не иметь значения в вашем случае, потому что ваш домен кажется гораздо более ограниченным, чем это,
По сути, я бы посмотрел на ваш дизайн в деталях и попытался выяснить, где лежат поведения ; затем извлеките все сходства в этом поведении в отдельный интерфейс и убедитесь, что он применим к вашему дизайну.
Тарифы могут быть связаны с проверочным поведением, связанным с ними. Допустим, вы добавляете комиссию к любому Ордену, который имеет 20 или более предметов (просто случайный пример, запустите со мной этот). Теперь, когда вы добавляете 20-й предмет, вы можете добавить этот сбор в Орден, но есть проблема; Когда вы удаляете товар из вашего заказа, хотите ли вы каждый раз проверять, нужно ли вам удалять этот сбор из вашего заказа? Я сомневаюсь в этом; здесь подразумевается, что есть поведение, связанное с комиссионными / скидками, которое, по сути, делает их совершенно другим классом вещей.
Я бы посмотрел на это так; классифицируйте Комиссионные и Скидки как «Особые» вещи, а затем создайте интерфейс «ISpecial», от которого наследуются и Комиссионные, и Скидки. Извлеките любую общую функциональность в интерфейс ISpecial (например, «Validate»). Затем сделайте так, чтобы ваш Order реализовал интерфейс ISpecial (или любой другой).
Таким образом, вы можете определить конкретное поведение Fee.Validate () и поведение Discount.Validate, и работать правильно благодаря магии полиморфизма ( foreach of m_specialCollection. проверить эти). Таким образом, вы также можете легко расширить интерфейс Special для всего, что может понадобиться (скажем,
Одним из вариантов является добавление атрибута 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%.
Я думаю, что суть проблемы, с которой вы здесь столкнулись, заключается в том, что вы реализовали 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
. Я думаю, что оба подхода имеют свои плюсы и минусы.)