Вместо того, чтобы притворяться, что я могу решить вашу проблему, которая, на самом деле, я не чувствую, что у меня достаточно информации, я поделюсь с вами общим принципом: СУХОЙ или Не повторяйте себя. В вашем случае у вас есть кусок кода, который вы хотите использовать в двух местах. До сих пор вы преуспеваете в том, что вычисления производятся только одним методом. Это хорошо и соответствует принципу СУХОЙ.
Теперь некоторые люди захотят просто вырезать / вставить код между двумя методами. Это нарушило бы принцип СУХОГО, потому что вам пришлось бы повторять один и тот же код и поддерживать его в двух местах. Хуже того, они могут случайно отклониться и начать делать разные вещи, приводящие к ошибкам. Вы избежали этой ловушки, желая напрямую использовать код в другом методе. Пока все хорошо.
Следующим шагом является рефакторинг, чтобы воспользоваться существующим кодом. Вот где это может быть сложно, потому что вы, как правило, хотите повторно использовать только часть кода. В вашем случае я подозреваю, что вы не всегда хотите устанавливать ltrl_showText
всякий раз, когда вы устанавливаете ltrl_previewText
. Если это так, то вы должны ввести третий метод, который каждый из первых двух вызывает, который выполняет вычисления для обоих.
protected decimal CalculateAmount()
{
decimal x = 50;
decimal tva = 1.196;
decimal totalAmount = 0;
return x * tva;
}
protected void ReservationForm()
{
decimal totalAmount = CalculateAmount();
ltrl_showText = "Total Amount is " + totalAmount;
}
protected void btn_submit_Click(object sender, EventArgs e)
{
decimal totalAmount = CalculateAmount();
ltrl_previewText = "You ordered nameProduct at the price of " + totalAmount ;
}
Теперь вы можете подумать, что мы закончили, но я не считаю это очень полезным. totalAmount
всегда одинаков. Это не кажется очень полезным. На данный момент, однако, я должен войти в сферу чистой догадки. Ясно, что значения, используемые для функции, берутся не из констант в коде, по крайней мере, цена должна быть, если не налоговая ставка. Вопрос в том, приходят ли они из одного места и для ReservationForm
, и для обработчика нажатия кнопки. Я подозреваю, что нет, поэтому самый разумный подход - заставить CalculateAmount
принять один или несколько параметров.
public decimal CalculateAmount( double cost )
{
decimal tva = 1.196;
return cost * tva;
}
protected void ReservationForm()
{
decimal cost = ...where do we get cost from? a database, a previous form, ???
decimal totalAmount = CalculateAmount(cost);
ltrl_showText = "Total Amount is " + totalAmount;
}
protected void btn_submit_Click(object sender, EventArgs e)
{
decimal cost = double.Parse( inp_ProductOrdered.Text ); // seems reasonable on a button click
decimal totalAmount = CalculateAmount(cost);
ltrl_previewText = "You ordered nameProduct at the price of " + totalAmount ;
}
Теперь единственное, что меня до сих пор беспокоит, это откуда берется налоговая ставка? Вероятно, это зависит от того, откуда заказывает человек. В этом случае вам, вероятно, потребуется ввести четвертый метод, который выполняет какой-то поиск в зависимости от местоположения человека, выполняющего заказ, и возвращает соответствующую налоговую ставку для этого человека. Я оставлю это как упражнение.
Я понятия не имею, решит ли это вашу проблему, но именно так я бы сделал рефакторинг. Подумайте о том, что вы можете поделиться и где эти вещи получают свои данные. Абстрагируй это от кода, который ты можешь использовать повторно.
РЕДАКТИРОВАТЬ : Вы действительно должны использовать decimal
(или пользовательский тип денег) вместо double
для денег, ср. , Что лучше тип данных для использования в деньгах в c #?