วิธีการคงที่ส่วนตัวใน C # ทำร้ายอะไรหรือไม่?


10

ฉันสร้างวิธีการตรวจสอบส่วนตัวสำหรับการตรวจสอบความถูกต้องบางอย่างที่เกิดขึ้นหลายครั้งในชั้นเรียนของฉัน (ฉันไม่สามารถจัดเก็บข้อมูลที่ตรวจสอบได้ด้วยเหตุผลหลายประการ) ตอนนี้ ReSharper แสดงให้เห็นว่าฟังก์ชั่นสามารถทำให้คงที่ ฉันลังเลเล็กน้อยที่จะทำเช่นนั้นเนื่องจากปัญหาที่ทราบกันดีกับวิธีการคงที่ มันจะเป็นวิธีการคงที่ส่วนตัว คำถามของฉันคือวิธีคงที่ส่วนตัวสามารถทำให้เกิดการแต่งงานกันและปัญหาการทดสอบเช่นวิธีคงที่สาธารณะ? มันเป็นการปฏิบัติที่ไม่ดีหรือไม่? ฉันจะเดาไม่ได้ แต่ฉันไม่แน่ใจว่ามีหลุมพรางที่นี่หรือไม่


10
"ปัญหาที่ทราบ" ของวิธีแบบคงที่คืออะไร
Robert Harvey

3
@Ed: ถูกต้อง วิธีการแบบคงที่ที่เขียนอย่างเหมาะสมไม่ควรแตะ API หรือสถานะภายนอก การจัดการสถานะภายในที่ห่อหุ้มภายในคลาสดูเหมือนว่าสมบูรณ์ดีสำหรับฉันและวิธีการนี้ไม่จำเป็นต้องผ่านการทดสอบหน่วยเนื่องจากการทดสอบหน่วยจะทดสอบพฤติกรรมภายนอกของชั้นเรียน
Robert Harvey

1
วิธีการแบบคงที่มีแนวโน้มที่จะแก้ไขสถานะโลกและพวกเขายังฆ่ามรดก (เมื่อใดก็ตามที่คุณต้องการที่จะขยายการทำงานคุณจะต้องแก้ไขรหัสโทรเพราะคุณไม่สามารถแทนที่วิธีการในชั้นเรียนที่ได้รับ) คุณเชื่อมโยงกับการนำไปใช้งานนั้น วิธีการคงที่ไม่สามารถเยาะเย้ยซึ่งทำให้ยากต่อการทดสอบหน่วย พวกเขาซ่อนพึ่งพา ฉันแน่ใจว่ามีมากขึ้น ไม่ใช่เพื่อหลีกเลี่ยงการสุ่มสี่สุ่มห้าฉันขอให้ตัดสินใจอย่างมีข้อมูล
Tamás Szelei

2
@ Tamásวิธีการคงที่แก้ไขสถานะโลกถ้าคุณเขียนพวกเขาด้วยวิธีการที่ฉันไม่เคยทำ โดยทั่วไปฉันจะใช้วิธีการคงที่ในคลาสยูทิลิตี้วิธีการที่วัตถุหนึ่งหรือมากกว่าและส่งคืนวัตถุโดยไม่มีผลข้างเคียง วิธีการเหล่านี้ไม่มีปัญหาที่คุณอธิบาย
Robert Harvey

1
@ TamásSzeleiพวกเขามีแนวโน้มที่จะแก้ไขสถานะโลกได้อย่างไร? พวกเขาไม่สามารถหารัฐทั่วโลกได้หากคุณไม่ผ่านมันเข้าไปในพารามิเตอร์
CodesInChaos

คำตอบ:


16

ฉันจะคิดว่า: "ฉันจำเป็นต้องทดสอบสิ่งนี้หรือไม่?"

หากวิธีการของคุณเป็นแบบส่วนตัวหมายความว่าคุณไม่ต้องการหน่วยทดสอบตรรกะในวิธีการนั้นแล้วตราบใดที่ความสามารถในการทดสอบและการบำรุงรักษานั้นเกี่ยวข้องกับชั้นเรียนของคุณคือกล่องดำทั้งสองวิธีการทำงานภายในห้องเรียนของคุณ และมันคนเดียว การปรับโครงสร้างจะไม่ได้รับผลกระทบเช่นกันซึ่งเป็นสิ่งที่ต้องพิจารณาด้วย

ดังนั้นในความคิดของฉัน: ไม่การสร้าง "ส่วนตัว" วิธี "ส่วนตัวคงที่" จะไม่มีผลกระทบระยะยาวใด ๆ


17

วิธีการคงที่ส่วนตัวเป็นสิ่งที่ง่ายที่สุดที่เป็นไปได้จากมุมมองของฉัน

DataIn -> Method -> DataOut

ไม่มีการพึ่งพาวัตถุภายนอกไม่มีผลข้างเคียง ทำไมคุณถึงคิดว่ามันแย่


ขอบคุณ. ฉันอธิบายข้อกังวลของฉันในความคิดเห็นภายใต้คำถาม
Tamás Szelei

2
สิ่งที่คุณอธิบายนั้นถูกต้องเฉพาะสำหรับวิธีการแบบคงที่ไม่ได้ขึ้นอยู่กับตัวแปรสมาชิกแบบคงที่ - นั่นคือสิ่งที่สามารถสร้างความแตกต่างระหว่างวิธีการแบบ "ดี" และ "ไม่ดี" แบบคงที่
Doc Brown

2

คลาสการทดสอบที่ใช้วิธีการคงที่สาธารณะอาจเป็นเรื่องยากเนื่องจากไม่ใช่วิธีที่ง่ายต่อการ stub / ปลอม / เยาะเย้ยวิธีการคงที่ ในขณะที่วิธีการอินสแตนซ์สามารถเยาะเย้ยได้อย่างง่ายดายโดยเฉพาะอย่างยิ่งถ้าพวกเขาเสมือนหรืออินเทอร์เฟซที่ตอบสนอง

อย่างไรก็ตามฉันไม่เห็นเหตุผลที่จะไม่ใช้วิธีการคงที่ส่วนตัว ที่จริงแล้วมันมีข้อดีด้านประสิทธิภาพเล็กน้อยเนื่องจากคุณไม่ต้องการอินสแตนซ์ของคลาสเพื่อครอบครองหน่วยความจำ

ในทางตรงกันข้ามอะไรคงที่เป็นบิตของรหัสกลิ่น นี่เป็น "คลาสผู้ช่วย" จริงหรือไม่ เป็นไปได้ไหมว่าวิธีนี้จะมีประโยชน์มากขึ้นกับหนึ่งในคลาสที่ส่งผ่านเป็นพารามิเตอร์หรือไม่? คำตอบสำหรับคำถามเหล่านั้นมักจะ "มันดีเหมือนสถิต" แต่มันก็คุ้มค่าที่จะจำ


คลาสที่มีเมธอดสแตติกกำลังครอบครองหน่วยความจำอยู่แล้ว คุณกลัวstaticคำหลักที่ไม่มีมูลความจริง
Robert Harvey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.