ฉันมีฟังก์ชั่น API นี้:
public ResultEnum DoSomeAction(string a, string b, DateTime c, OtherEnum d,
string e, string f, out Guid code)
ฉันไม่ชอบมัน เนื่องจากลำดับพารามิเตอร์มีความสำคัญเกินความจำเป็น การเพิ่มฟิลด์ใหม่กลายเป็นเรื่องยาก มันยากที่จะเห็นสิ่งที่ถูกส่งผ่าน มันยากกว่าที่จะ refactor method เป็นชิ้นส่วนเล็ก ๆ เพราะมันจะสร้างโอเวอร์เฮดอีกครั้งในการส่งผ่านพารามิเตอร์ทั้งหมดในฟังก์ชั่นย่อย รหัสอ่านยากกว่า
ฉันคิดขึ้นมาด้วยความคิดที่ชัดเจนที่สุด: ให้อ็อบเจกต์ห่อหุ้มข้อมูลแล้วส่งไปรอบ ๆ แทนที่จะส่งแต่ละพารามิเตอร์ทีละหนึ่ง นี่คือสิ่งที่ฉันมาด้วย:
public class DoSomeActionParameters
{
public string A;
public string B;
public DateTime C;
public OtherEnum D;
public string E;
public string F;
}
นั่นทำให้การประกาศ API ของฉันลดลงเป็น:
public ResultEnum DoSomeAction(DoSomeActionParameters parameters, out Guid code)
ดี ดูไร้เดียงสามาก แต่เราแนะนำการเปลี่ยนแปลงครั้งใหญ่: เราแนะนำความไม่แน่นอน เพราะสิ่งที่เราทำก่อนหน้านี้คือการส่งผ่านวัตถุที่ไม่เปลี่ยนรูปแบบไม่ระบุชื่อ: พารามิเตอร์ฟังก์ชั่นในกอง ตอนนี้เราสร้างคลาสใหม่ซึ่งไม่แน่นอน เราได้สร้างความสามารถในการจัดการกับสถานะของการโทร ที่ดูด ตอนนี้ฉันต้องการวัตถุที่ไม่เปลี่ยนรูปฉันจะทำอย่างไร
public class DoSomeActionParameters
{
public string A { get; private set; }
public string B { get; private set; }
public DateTime C { get; private set; }
public OtherEnum D { get; private set; }
public string E { get; private set; }
public string F { get; private set; }
public DoSomeActionParameters(string a, string b, DateTime c, OtherEnum d,
string e, string f)
{
this.A = a;
this.B = b;
// ... tears erased the text here
}
}
อย่างที่คุณเห็นฉันสร้างปัญหาเดิมของฉันขึ้นมาใหม่จริง: มีพารามิเตอร์มากเกินไป เห็นได้ชัดว่าไม่ใช่วิธีที่จะไป ฉันกำลังจะทำอะไร? ตัวเลือกสุดท้ายเพื่อให้บรรลุความไม่สามารถเปลี่ยนแปลงได้คือใช้โครงสร้าง "แบบอ่านอย่างเดียว" ดังนี้
public struct DoSomeActionParameters
{
public readonly string A;
public readonly string B;
public readonly DateTime C;
public readonly OtherEnum D;
public readonly string E;
public readonly string F;
}
ที่ช่วยให้เราหลีกเลี่ยงการก่อสร้างที่มีพารามิเตอร์มากเกินไปและบรรลุความไม่สามารถเปลี่ยนแปลงได้ ที่จริงมันแก้ไขปัญหาทั้งหมด (พารามิเตอร์การสั่งซื้อ ฯลฯ ) ยัง:
- ทุกคน (รวมถึง FXCop และจอนสกีต) ยอมรับว่าการเปิดเผยทุ่งสาธารณะที่ไม่ดี
- เอริค Lippert et al, กล่าวว่าอาศัยอยู่ในเขตอ่านได้อย่างเดียวสำหรับการเปลี่ยนไม่ได้เป็นเรื่องโกหก
นั่นคือเมื่อฉันสับสนและตัดสินใจที่จะเขียนคำถามนี้: อะไรคือวิธีที่ตรงไปตรงมาที่สุดใน C # เพื่อหลีกเลี่ยงปัญหา "พารามิเตอร์มากเกินไป" โดยไม่ต้องแนะนำความไม่แน่นอน เป็นไปได้ไหมที่จะใช้โครงสร้างแบบอ่านอย่างเดียวเพื่อจุดประสงค์นั้นและยังไม่มีการออกแบบ API ที่ไม่ดี
คำชี้แจง:
- โปรดสมมติว่าไม่มีการละเมิดหลักการ responsibiltiy เดียว ในกรณีเดิมของฉันฟังก์ชั่นเพิ่งเขียนพารามิเตอร์ที่กำหนดไปยังระเบียนฐานข้อมูลเดียว
- ฉันไม่ได้กำลังหาวิธีแก้ปัญหาเฉพาะสำหรับฟังก์ชั่นที่กำหนด ฉันกำลังหาแนวทางทั่วไปในการแก้ไขปัญหาดังกล่าว ฉันสนใจที่จะแก้ปัญหา "พารามิเตอร์มากเกินไป" โดยไม่ต้องแนะนำความไม่แน่นอนหรือการออกแบบที่แย่มาก
UPDATE
คำตอบที่ให้ไว้ที่นี่มีข้อดี / ข้อเสียแตกต่างกัน ดังนั้นฉันต้องการแปลงเป็นวิกิชุมชน ฉันคิดว่าคำตอบแต่ละตัวอย่างพร้อมโค้ดตัวอย่างและข้อดี / ข้อเสียจะเป็นแนวทางที่ดีสำหรับปัญหาที่คล้ายกันในอนาคต ตอนนี้ฉันกำลังพยายามหาวิธีทำ
DoSomeActionParameters
เป็นวัตถุที่ถูกโยนทิ้งซึ่งจะถูกทิ้งหลังจากการเรียกใช้เมธอด