Избежание транспонированных параметров без создания связи - PullRequest
0 голосов
/ 12 июля 2020

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

Два класса с некоторыми соответствующими свойствами:

    public class PartModel
    {
        public int PartId { get; private set; }
        public string PartTitle { get; set; }
        public string PartDescription { get; set; }
        public int Quantity { get; set; }
        public int MinimumStock { get; set; }

        public void AddToStock (int quantityToAdd) {
            Quantity += quantityToAdd;
        }

        public void RemoveFromStock (int quantityToRemove) {
            Quantity -= quantityToRemove;
            CheckMinimumStock();
        }
    }

    public class EngineerModel
    {
        public int EngineerId { get; private set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public List<PartModel> PartsInStock { get; set; } = Factory.CreatePartsList();
    }

Как видите, у каждого инженера есть список запасных частей через List<PartModel>. Я хочу передать в этот список еще один список, чтобы я мог обновить его соответственно (увеличивая или уменьшая количества, а затем добавляя или удаляя части списка по мере необходимости).

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

EngineerModel и работать с PartsInStock, верно? Но как насчет того, чтобы использовать ту же операцию для других классов (например, если у меня есть список частей, связанных с рабочей задачей)? Затем я извлекаю метод в другой класс и ... Я передаю два списка в качестве параметров в методе, поэтому я вернулся туда, где был.

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

1 Ответ

0 голосов
/ 12 июля 2020

Используйте метод расширения

Спасибо @ DavidBrowne-Microsoft за разъяснение этого вопроса. Определяя метод расширения для List<PartModel>, ему нужен только один параметр - список, содержащий обновления (foreach ниже на основе ответа @ Валентина на этот вопрос ).

public static class PartsHandler
{
    public static List<PartModel> UpdateStockQuantitiesWith(this List<PartModel> stockToBeUpdated, List<PartModel> stockUpdates) {
        foreach ( var part in stockUpdates )
        {
            var partToBeUpdated = stockToBeUpdated.FirstOrDefault(x => x.PartId == part.PartId);
            if ( partToBeUpdated != null )
            { partToBeUpdated.Quantity += part.Quantity; }
            else
            { stockToBeUpdated.Add(part); }
        }
        stockToBeUpdated.RemoveAll(x => x.Quantity <= 0);

        return stockToBeUpdated;
    }
}

Теперь любой класс, которому необходимо это реализовать, может просто вызвать его в методе соответствующего свойства. Например, в классе EngineerModel он может работать со свойством PartsInStock:

public void AddPartsToStock(List<PartModel> partsSent) {
    PartsInStock.UpdateStockQuantitiesWith(partsSent);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...