เมื่อเร็ว ๆ นี้ฉันได้แยกข้อกำหนดของบริษัทออก และในหมู่พวกเขา "จำนวนพารามิเตอร์ของฟังก์ชันไม่ควรเกิน 4" ค่อนข้างขัดแย้งกันในระหว่างการเลื่อนตำแหน่ง หากสามารถทำงานให้เสร็จสิ้นได้ พารามิเตอร์ก็จะยิ่งน้อยลงเท่านั้น มีข้อโต้แย้ง แต่การทำเช่นนั้นอาจทำให้เกิดปัญหาในการเขียนโปรแกรม และมีการถกเถียงกันว่าคุ้มค่าหรือไม่ ฉันคิดว่าการทำเช่นนี้เพื่อให้ง่ายขึ้นสำหรับผู้ที่ใช้ฟังก์ชันต่างๆ สำหรับปัญหาในการเขียนโปรแกรม มักเป็นเพราะเราไม่คุ้นเคยกับวิธีการลดพารามิเตอร์บางอย่าง ต่อไปนี้เป็นข้อมูลสรุปบางส่วนสำหรับการอ้างอิงของคุณ:
1. ใช้โครงสร้างเพื่อสรุปพารามิเตอร์
ตัวอย่าง: เพิ่มผู้ใช้
เนื้อความฟังก์ชันดั้งเดิม: AddUser (ชื่อผู้ใช้สตริง, รหัสผ่านสตริง, ที่อยู่สตริง, โทรศัพท์สตริง, อายุ int)
Refactor: เพิ่มคลาสผู้ใช้:
ผู้ใช้คลาส
-
ชื่อผู้ใช้สตริงสาธารณะ { รับ; ชุด;
รหัสผ่านสตริงสาธารณะ { รับ; ชุด;
ที่อยู่สตริงสาธารณะ { รับ; ชุด;
โทรศัพท์สตริงสาธารณะ { รับ;
อายุ int สาธารณะ { รับ;
-
เปลี่ยน AddUser เป็น: AddUser(ผู้ใช้ผู้ใช้)
ปัญหา: หากไม่ได้ใช้คลาสที่เพิ่มในที่อื่น เรามักจะรู้สึกว่ามันไม่คุ้มค่า ในเวลานี้ เราสามารถพิจารณาใช้คลาสที่ไม่ระบุชื่อเพื่อสรุปพารามิเตอร์
2. ใช้แอตทริบิวต์เพื่อแทนที่พารามิเตอร์
หากวิธี AddUser ใน 1 ถูกวางไว้ในคลาส User พารามิเตอร์ผู้ใช้ในวิธี AddUser ก็สามารถละเว้นได้ บางครั้งแอตทริบิวต์บางอย่างอาจถูกเพิ่มเพื่อลดจำนวนพารามิเตอร์ในบางวิธี ในการออกแบบเชิงวัตถุ วัตถุควรรับผิดชอบต่อตนเอง และควรมีการกำหนดความรับผิดชอบไว้อย่างชัดเจน สาเหตุที่เมธอดมีพารามิเตอร์มากเกินไปอาจเป็นเพราะว่าเมธอดถูกเขียนในตำแหน่งที่ไม่ควรมีโมเดล "ผู้เชี่ยวชาญด้านข้อมูล" ที่กล่าวถึงในหลักการ GRASP สามารถลดจำนวนพารามิเตอร์ได้ในหลายกรณี
ตัวอย่าง: การโอนบัญชี
ฟังก์ชั่นเดิม: โอนเงิน (บัญชีจาก, บัญชีไป, เงินทศนิยม)
การปรับโครงสร้างใหม่:
รหัส
TransferProcess ระดับสาธารณะ
-
บัญชีส่วนตัวจาก;
บัญชีส่วนตัวถึง;
กระบวนการโอนเงินสาธารณะ(บัญชีจาก, บัญชีถึง)
-
นี้.จาก = จาก;
นี้.ถึง = ถึง;
-
การโอนโมฆะสาธารณะ (เงินทศนิยม)
-
ถ้า (เงิน<จาก.เงิน)
-
From.Money = From.Money - เงิน;
To.Money = To.Money + เงิน;
//อัพเดตฐานข้อมูล
-
อื่น
-
โยนข้อยกเว้นใหม่ ("ยอดคงเหลือเกิน");
-
-
-
หมายเหตุ: รูปแบบผู้เชี่ยวชาญด้านข้อมูลเป็นหลักการพื้นฐานที่สุดของการออกแบบเชิงวัตถุ เมื่อเราออกแบบวัตถุ (คลาส) หากคลาสมีข้อมูลทั้งหมดที่จำเป็นในการบรรลุความรับผิดชอบบางอย่าง ความรับผิดชอบนี้ควรถูกกำหนดให้กับคลาสนี้เพื่อการนำไปใช้งาน . ขณะนี้ชั้นเรียนนี้เป็นผู้เชี่ยวชาญด้านข้อมูลที่สอดคล้องกับความรับผิดชอบนี้
3. ใช้ฟังก์ชั่นส่วนตัว
เมื่อเรียกใช้ฟังก์ชัน เรามักจะไม่ต้องการพารามิเตอร์เชิงโต้ตอบมากมาย แต่เมื่อเราระบุพารามิเตอร์ เราจำเป็นต้องระบุเงื่อนไขทั้งหมด ในขณะนี้ เราสามารถจัดประเภทฟังก์ชัน แค็ปซูลฟังก์ชันที่ซับซ้อนที่สุดให้เป็นฟังก์ชันส่วนตัว และเปิดเผย ฟังก์ชันง่ายๆ เรียกใช้ฟังก์ชันที่ซับซ้อนเหล่านี้เพื่อทำให้ฟังก์ชันสมบูรณ์ มาดูการใช้งานวิธี TextBox ใน mvc กัน:
รหัส
กล่องข้อความสตริงสาธารณะแบบคงที่ (HtmlHelper htmlHelper นี้ ชื่อสตริง ค่าวัตถุ IDictionary <string, object> htmlAttributes) {
กลับ InputHelper(htmlHelper, InputType.Text, ชื่อ, ค่า, (ค่า == null) /* useViewData */, false /* isChecked */, true /* setId */, true /* isExplicitValue */, htmlAttributes);
-
สตริงคงที่ส่วนตัว InputHelper (HtmlHelper นี้ htmlHelper, InputType inputType, ชื่อสตริง, ค่าวัตถุ, บูล useViewData, บูล isChecked, บูล setId, บูล isExplicitValue, IDictionary <สตริง, วัตถุ> htmlAttributes) {
ถ้า (String.IsNullOrEmpty (ชื่อ)) {
โยน ArgumentException ใหม่ (MvcResources.Common_NullOrEmpty, "ชื่อ");
-
TagBuilder tagBuilder = TagBuilder ใหม่ ("อินพุต");
-
แต่บางครั้งเพื่อให้ผู้โทรมีความยืดหยุ่นสูงสุด เราอาจเปิดเผยฟังก์ชันที่ซับซ้อนที่สุดมากเกินไป
4. คีย์เวิร์ดพารามิเตอร์
ระบุว่าเมื่อจำนวนพารามิเตอร์แปรผัน จะใช้พารามิเตอร์เมธอดของพารามิเตอร์
การใช้งาน:
รหัส
โมฆะคงที่หลัก (สตริง [] args)
-
ใช้พารามิเตอร์(1, 2, 3);
-
โมฆะสาธารณะคง UseParams (รายการ params int [])
-
สำหรับ (int i = 0; i < list.Length; i++)
-
Console.WriteLine (รายการ [i]);
-
คอนโซล.WriteLine();
-
วิธีการนี้ไม่ได้ลดจำนวนพารามิเตอร์จริงๆ แต่เพียงทำให้ส่วนของฟังก์ชันง่ายขึ้นเท่านั้น
5. ใช้คลาสที่ไม่ระบุชื่อเพื่อสรุปพารามิเตอร์
ความรู้เบื้องต้น มาดู RouteValueDictionary กันก่อน
รหัส
โมฆะคงที่หลัก (สตริง [] args)
-
RouteValueDictionary r = RouteValueDictionary ใหม่ (ใหม่ { id = 1, ชื่อ = "lfm"});
foreach (รายการ var ใน r)
-
Console.WriteLine("{0}:{1}", item.Key, item.Value);
-
//Console.WriteLine();
-
ผลลัพธ์:
รหัส:1
ชื่อ:lfm
RouteValueDictionary สามารถจัดเก็บชื่อแอตทริบิวต์และค่าแอตทริบิวต์ของอินสแตนซ์ลงในพจนานุกรมได้
หลายแห่งใน mvc ใช้วิธีนี้เพื่อส่งพารามิเตอร์
ตัวอย่างเช่น: <%= Html.ActionLink("Details", "Details", new { id=item.id })%>
ในเนื้อหาของเมธอด ActionLink นั้น RouteValueDictionary จะถูกใช้เพื่อแยกย่อยอ็อบเจ็กต์ที่ไม่ระบุชื่อ จากนั้นจึงประกอบเข้ากับลิงก์