"Ты должен правительство?" классы


Мои параметры передать класс внутренне или эталонного уровня класса переменные?

Я не уверен, о лучший подход или стиль для вызова процедур с параметрами. Я должен идти с уровнем класса переменные?

public class YouOweTheGovernment
{
    public float AmountToPay { get; private set; }
    public float ArbitraryTaxRate { get; private set; }
    public float Salary { get; private set; }

    public YouOweTheGovernment(float taxRate, float salary)
    {
        this.ArbitraryTaxRate = taxRate;
        this.Salary = salary;

        CalculateAmount();
    }

    private void CalculateAmount()
    {
        this.AmountToPay = (this.Salary * (this.ArbitraryTaxRate / 100));
    }
}

Или явно передавать параметры в процедуру?

public class YouOweTheGovernment
{
    public float AmountToPay { get; private set; }
    public float ArbitraryTaxRate { get; private set; }
    public float Salary { get; private set; }

    public YouOweTheGovernment(float taxRate, float salary)
    {
        this.ArbitraryTaxRate = taxRate;
        this.Salary = salary;

        CalculateAmount(this.Salary, this.ArbitraryTaxRate);
    }

    private void CalculateAmount(float salary, float taxRate)
    {
        this.AmountToPay = (salary * (taxRate / 100));
    }
}

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



1650
12
задан 28 января 2011 в 11:01 Источник Поделиться
Комментарии
5 ответов

Я пытаюсь использовать класс уровень переменные , если нет особых причин этого не делать. Мои рассуждения для этого является то, что он чувствует себя чище с точки зрения API-интерфейс.

Некоторые из причин я хотел бы передать явных параметров:


  • Увеличение повторного использования метода.

  • Проясните суб-типы переменных, необходимых для метода.

  • Отделить метод от специфики содержащего типа.

Я думаю (надеюсь), что есть гораздо более аргументированной и научной литературы по этой теме, но я достаточно далеко далеко от моего коллежского дней даже не представляют, что название этой темы будет. Как такового, я склонен выбирать то, что "чувствует" право. Если существует способ, чтобы просто убирать другим способом и/или инкапсулировать немного логики, я, как правило, используют на уровне класса область видимости переменной.

7
ответ дан 28 января 2011 в 02:01 Источник Поделиться

Не храните то, что вы можете рассчитать:

public class YouOweTheGovernment
{
public float AmountToPay
{
get { return Salary * (ArbitraryTaxRate / 100); }
}
public float ArbitraryTaxRate { get; private set; }
public float Salary { get; private set; }

public YouOweTheGovernment(float taxRate, float salary)
{
this.ArbitraryTaxRate = taxRate;
this.Salary = salary;
}
}

Ваш AmountToPay поле в основном кэш, и кэширование крайне проблематично. Дело в точку: даже крошечный код имеет кэш ошибка инвалидации. Если вы изменить налоговые ставки или оклада, вы не пересчитывать сумму к оплате.

Каждый раз, когда вы добавить поле, спросите себя: "это поле хранилище уникальной информации, что никакой другой сфере магазины?" Если ответ-Нет, не создают поля. Чем меньше государство, тем легче понять код.

9
ответ дан 28 января 2011 в 06:01 Источник Поделиться

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

Если посчитать количество функций делает только эту одну строку, то лучше для вас взять свою линию в этом.AmountToPay = (оклад * (taxRate / 100)); и положить ее в конструкторе, а также. Если это одна линия, почему вызов функции, загрузить стек и хранить регистры? Просто рядные этой линии логики в конструкторе сам, таким образом AmountToPay будут инициализированы значениями из конструктора аргументов, таким образом доступ будет быстрее, потому что это локальная переменная (избиение в первом примере), и логика, которая обновляет AmountToPay не нужна функция звонков, в том числе укладки аргументы (избиение во втором примере).

Однако, если вы планируете создавать более одного конструктора, то держать все в общий код в одном месте (в методе init()функция).
Например, предположим, что мы хотели другого конструктора, который также брал кредиты, то вы могли бы сделать это.

YouOweTheGov(float taxRate, float salary, float loans)
{
... Process logic relating to loans..
init(taxRate,salary); // this function updates ArbitraryTaxRate,Salary,AmountToPay
}

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

5
ответ дан 28 января 2011 в 11:01 Источник Поделиться

Второй CalculateAmount способ-это зло. Если в классе инвариантных предполагается, что AmountToPay является сумма налога за зарплату и ArbitraryTaxRate, называя CalculateAmount ничего, кроме этих параметров будет нарушать инвариант класса. Если вы хотите передать зарплату и ArbitraryTaxRate методу, то этот метод должен либо:


  1. Быть функция, которая возвращает вычисленную сумму, но ничего не беспокоить в классе, или

  2. Набор резервного поля для зарплаты и ArbitraryTaxRate до указанных значений, и обновление AmountToPay надлежащим образом.

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

5
ответ дан 28 января 2011 в 10:01 Источник Поделиться

В дополнение к предложениям выложили уже, я рекомендовал бы идти дальше с вашей CalculateAmount способ:

public class YouOweTheGovernment
{
public float AmountToPay { get; private set; }
public float ArbitraryTaxRate { get; private set; }
public float Salary { get; private set; }

public YouOweTheGovernment(float taxRate, float salary)
{
this.ArbitraryTaxRate = taxRate;
this.Salary = salary;

this.AmountToPay = CalculateAmount(this.Salary, this.ArbitraryTaxRate);
}

private float CalculateAmount(float salary, float taxRate)
{
return (salary * (taxRate / 100));
}
}

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

3
ответ дан 28 января 2011 в 02:01 Источник Поделиться