[問題] 新手想問關於get; set;和陣列

作者: Moneyyyyy (鄭竹)   2019-04-18 17:56:17
我需要先有十個Sale物件
fields需要inventoryNum庫存數量、saleAmount銷售額、taxOwed所欠的稅
皆由使用者輸入
當銷售額使用set存取器設定好後,taxOwed也被計算出來
(銷售額低於100稅率是0.08,大於一百超出額是0.06)
所以我寫了如下的程式碼
Main method 裡面
{
Sale[] sales = new Sale[10];
for (int i = 0; i < sales.Length; i++)
{
sales[i] = new Sale();
sales[i].InventoryNum = ReadLine();
sales[i].SaleAmount = ReadLine();
}
}
然後class中長這樣
{
private int inventoryNum; //庫存數量
private double saleAmount; //銷售額
private double taxOwed;
public double SaleAmount
{
get { return saleAmount; }
set
{
saleAmount = value;
if (saleAmount <= 100)
{
taxOwed = 0.08 * saleAmount;
}
else
{
taxOwed = 0.08 * 100 + 0.06 * (saleAmount - 100);
}
}
}
}
其他部分沒有詳細寫出來,這樣是可以跑的
1. 想問一般情況大家會在set裡面寫兩行以上的程式碼嗎?(我知道官方建議是一行
2. 會有什麼缺點嗎?
然後延伸部分是,當我今天要使用c#內建的排序方法去將銷售額排出順序時
會出現問題,因為Array.Sort(這邊必須放陣列)
但是我的sales[0].taxOwed和sales[1].taxOwed和其他的taxOwed並不是一整個陣列
所以我將原本建立Sales物件陣列(如上面敘述的程式),改成
Sale sales = new Sale(10); (並且讓fiels都是陣列)
class中的程式碼長這樣
{
private int[] inventoryNum; //庫存數量
private double[] saleAmount; //銷售額
private double[] taxOwed;
public Sale(int size)
{
inventoryNum = new int[size];
saleAmount = new double[size];
taxOwed = new double[size];
}
public int[] InventoryNum
{
get { return inventoryNum; }
set { inventoryNum = value; }
}
public double[] SaleAmount
{
get { return saleAmount; }
set
{
saleAmount = value;
for (int i = 0; i < 10; i++)
{
if (saleAmount[i] <= 100)
{
taxOwed[i] = 0.08 * saleAmount[i];
}
else
{
taxOwed[i] = 0.08 * 100 + 0.06 * (saleAmount[i] - 100)
;
}
}
}
}
}
但是這樣的程式碼存入銷售額的時候,並不會去計算taxOwed
推測是set中不會進入for迴圈
想請問
3.是不是只能另外寫一個calc method去計算,然後在main method裡面呼叫?
4.關於這兩種陣列的寫法
Sale[] sales = new Sale[10]; //第一種:物件是陣列
Sale sales = new Sale(10); //第二種:實際上是fields是陣列
有沒有什麼差別?或是使用時機?優缺點等等
如果對內容有建議,麻煩鞭小力一點
謝謝各位大大
作者: s4300026 (s4300026)   2019-04-18 19:16:00
1.官方沒有建議只能一行吧? set的用意是有些變數在存檔前要預先處理,如果直接呼叫變數,則會有漏處理的情況
作者: jass970991 (半糖綠假面超人)   2019-04-18 21:35:00
你這樣寫啊不哪天class傳到其他地方 又決定修改這個class 就越變越大坨 為什麼不好好的處理完再傳進去那我會把他們兩個用tuple 或另設一個class來readonly, 當你要設定一個值的時候會強迫另外一個也要賦值同時做好一個calculator, 只要輸入 amount 自動產生一組可以直接用的tax amount pair把ds和邏輯分開真的非常重要
作者: Moneyyyyy (鄭竹)   2019-04-18 22:37:00
喔喔,學到一課,謝謝,我來查查tuple是什麼~
作者: wezmag (wezmag)   2019-04-19 19:28:00
有個嚴重的缺點,錢請用decimal,用double會出問題
作者: forewero (木日一)   2019-04-20 10:51:00
我自己寫除了預設值以外不會在model 做事,不是不行,但不直觀;權責沒分清後續接手很痛苦
作者: Litfal (Litfal)   2019-04-20 11:43:00
當你的屬性值只和class內的資料相關時,就可以寫在model裡而你的稅務計算聽起來就很專業XD, 又有8%,100,6%這種與類無關的魔術數字,建議另外拉一個Service或Helper class算
作者: vi000246 (Vi)   2019-04-21 23:40:00
如果只是amount = salse x price之類簡單的邏輯可以寫在set或get裡 複雜一點的算式就不建議了

Links booklink

Contact Us: admin [ a t ] ucptt.com