Используя характеристики при тестировании процесс присвоения предлагает клиенту 2


Исходя из этого вопрос: используя характеристики при тестировании процесс присвоения предлагает клиент. Я получил некоторые полезные предложения от t3chb0t и Папараццо. Поэтому я решила пересмотреть код (без спецификации). Вот новая версия кода:

public class Concor : IProduct
    {
        private const decimal _expenditure = 100;    
        public bool IsEligible(Customer customer)
        {
            return (customer.Expenditure < _expenditure);
        }
    }

    public class Chestnut : IProduct
    {
        private const decimal _expenditure = 100;

        public bool IsEligible(Customer customer)
        {
            return (customer.Expenditure >= _expenditure);
        }
    }

    public interface IProduct
    {
        bool IsEligible(Customer customer);
    }

    public class Customer
    {
        private readonly Guid _id;
        private readonly decimal _expenditure;
        private readonly IList<IProduct> _eligibleProducts = new List<IProduct>();
        public IEnumerable<IProduct> EligibleProducts
        {
            get { foreach (var product in _eligibleProducts) yield return product; }
        }

        public Guid Id
        {
            get
            {
                return _id;
            }
        }

        public Decimal Expenditure
        {
            get
            {
                return _expenditure;
            }
        }

        public Customer(Guid id, decimal expenditure)
        {
            _id = id;
            _expenditure = expenditure;
        }

        public void AddProduct(IProduct eligibleProduct)
        {
            _eligibleProducts.Add(eligibleProduct);
        }

        public IEnumerable<IProduct> DetermineEligibility(IList<IProduct> availableProducts)
        {
            return availableProducts.Where(x => x.IsEligible(this));
        }
    }

Как она стоит клиентское приложение будет сделать что-то вроде этого:

var eligibleProducts= customer.DetermineEligibility(availableProducts).ToList<IProduct>();
eligibleProducts.ToList().ForEach(c => customer.AddProduct(c));

Вот некоторые моменты:

1) клиент теперь реализует метод интерфейса IEnumerable. Я понимаю рассуждения для удаления EligibilityCalculator, но я бродил, если сейчас заказчик имеет слишком много обязанностей.

2) я исправил проблемы со списком _assignedProducts от последнего вопроса: а) частная переменная (_eligibleProducts) и символ подчеркивания. б) общую переменную (EligibleProducts) не имеют подчеркивания.

3) переименовал AddOffer в AddProduct.

4) сократить количество строк кода в: IsEligible к 1.

5) сняли пол постоянно.

6) уменьшено число строк в DetermineEligibility (был CalculateEligibility) в 1.

7) сделал отдельный только для чтения поля, после введения публичных геттеров.

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

На мой конкретный вопрос окружает использование метода DetermineEligibility. Кроме того, я мог бы изменить AddProduct к этому (и удалить DetermineEligibhility):

public void AddProducts(IList<IProduct> availableProducts)
        {
            var eligibleProducts = availableProducts.Where(x => x.IsEligible(this));
            eligibleProducts.ToList().ForEach(c => _eligibleProducts.Add(c));
        }


97
1
задан 31 марта 2018 в 03:03 Источник Поделиться
Комментарии