ควรใช้วิธี C # ที่ * สามารถ * คงที่ได้หรือไม่? [ปิด]


104

วิธีการ C # ที่สามารถคงที่ควรเป็นแบบคงที่หรือไม่?

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

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


1
ความซ้ำของstackoverflow.com/questions/169378/…
JasonTrue

41
"ค่อนข้างแน่นอน" คือ oxymoron
Matt Briggs

1
Resharperซึ่งเป็นเครื่องมือ Visual Studio ของเครื่องมือบอกว่าใช่! :-)
รีเบคก้า

@Junto อาจจะอยู่ในเวอร์ชันของคุณ แต่ฉันบอกว่าสามารถสร้างแบบคงที่ได้ ...
Robbie Dee

คำตอบ:


60

มันขึ้นอยู่กับ. วิธีการคงที่มี 2 ประเภท:

  1. วิธีการที่คงที่เนื่องจากสามารถทำได้
  2. วิธีการที่คงที่เพราะต้องเป็น

ในฐานรหัสขนาดเล็กถึงขนาดกลางคุณสามารถใช้สองวิธีนี้แทนกันได้

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

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

ที่สามารถส่งผลอย่างใดอย่างหนึ่ง:

  1. การทำสำเนารหัสจำนวนมาก
  2. การระเบิดในจำนวนอาร์กิวเมนต์ของวิธีการ

ทั้งสองสิ่งนั้นเลวร้าย

ดังนั้นคำแนะนำของฉันคือถ้าคุณมีฐานรหัสมากกว่า 200K LOC ฉันจะทำให้เมธอดคงที่ก็ต่อเมื่อเป็นวิธีที่ต้องคงที่

การปรับโครงสร้างใหม่จากไม่คงที่เป็นแบบคงที่นั้นค่อนข้างง่าย (เพียงแค่เพิ่มคีย์เวิร์ด) ดังนั้นหากคุณต้องการสร้างแบบคงที่ให้เป็นแบบคงที่จริงในภายหลัง (เมื่อคุณต้องการฟังก์ชันภายนอกอินสแตนซ์) คุณก็สามารถทำได้ อย่างไรก็ตามการเปลี่ยนโครงสร้างแบบผกผันการเปลี่ยน can-be-static ให้เป็นวิธีอินสแตนซ์นั้นมีราคาแพงกว่ามาก

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

ดังนั้นสำหรับโปรเจ็กต์ใหญ่ ๆ อย่าทำให้สิ่งต่างๆนิ่งเว้นแต่คุณจะต้องการให้เป็น สำหรับโครงการขนาดเล็กเพียงแค่ทำในสิ่งที่คุณชอบมากที่สุด


43

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

นั่นไม่ได้หมายความว่าฉันจะไม่ทำให้มันคงที่เลย ถามตัวเองอย่างนี้: วิธีการใหม่ที่สมเหตุสมผลอาจอยู่ที่อื่นได้หรือไม่ หากคุณสามารถตอบว่า "ใช่" ได้คุณอาจต้องการทำให้เป็นแบบคงที่ (และย้ายด้วย) แม้ว่าจะไม่เป็นความจริง แต่คุณก็ยังทำให้มันคงที่ได้ อย่าทำเครื่องหมายไว้publicเพียงแค่ไม่ได้ทำเครื่องหมาย

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


6
เห็นด้วย โดยทั่วไปฉันจะสร้างเมธอด "private static" ในกรณีเช่นนี้
harpo

6
ฉันจะไม่ถือว่าเป็นภาพนิ่งส่วนตัวเช่นกัน สิ่งสำคัญคือถามตัวเองว่า: วิธีนี้เหมาะสมกับการเป็นส่วนหนึ่งของประเภทนี้หรือไม่หรือว่าที่นี่เป็นเพียงเรื่องของความสะดวก? ถ้าเป็นอย่างหลังมันจะเหมาะกับที่อื่นดีกว่าไหม
Joel Coehoorn

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

21

ไม่จำเป็น.

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


ฉันคิดว่าเขาอ้างถึงวิธีการส่วนตัวเป็นส่วนใหญ่
George Mauer

@Ray - ใช่สิ่งนี้ใช้ได้กับสมาชิกที่ไม่ใช่ส่วนตัวเท่านั้น ฉันอัปเดตคำตอบเพื่อแสดงถึงสิ่งนี้
Michael

ความคิดของฉันตรงไปตรงมา - เพียงเพราะคุณสามารถทำบางสิ่งที่คงที่ไม่ได้หมายความว่าคุณต้องหรือควร .....
marc_s

คุณจะทำอย่างไรสำหรับวิธีการส่วนตัวที่สามารถทำให้เป็นแบบคงที่ได้?
Ray

@Ray - อาจจะปล่อยให้เป็นอยู่จนกว่าฉันจะมีเหตุผลที่ดีพอที่จะย้ายไปอยู่ที่คงที่
Michael

13

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


11

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


8
ไม่จำเป็น. วิธีการคงที่จะไม่เข้าถึงข้อมูลอินสแตนซ์ไม่มีสมาชิกเหมือนที่คุณพูด แต่สามารถโต้ตอบกับคลาสอื่น ๆ ได้เช่นเดียวกับวิธีการทั่วไปอื่น ๆ การคงที่ไม่ได้หมายความว่าการมีเพศสัมพันธ์จะลดลงเสมอไป อย่างไรก็ตามฉันเข้าใจประเด็นของคุณ
Victor Rodrigues

1
แทนที่จะเป็นแบบคงที่จริงจะเพิ่มการมีเพศสัมพันธ์เนื่องจากคุณถูก จำกัด ไว้ที่วิธีการแบบคงที่เท่านั้นตัวอย่างเช่นไม่มีวิธีใดที่จะกำจัดมันได้ดังนั้นจึงไม่มีทางเปลี่ยนพฤติกรรมได้
HimBromBeere

8

ฉันคิดว่ามันจะทำให้อ่านได้ง่ายขึ้นถ้าคุณทำเครื่องหมายว่าคงที่ ... จากนั้นคนที่เข้ามาจะรู้ว่ามันไม่ได้อ้างอิงตัวแปรอินสแตนซ์ใด ๆ โดยไม่ต้องอ่านฟังก์ชันทั้งหมด ...


6

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

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

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

ใช่ไปเพื่อมันโดยทั้งหมด


2
วิธีการคงที่ยังคงสามารถเข้าถึงสถานะได้ มันได้รับสถานะจากวัตถุที่ส่งผ่านไปยังมัน ในทางกลับกันช่องอินสแตนซ์ไม่จำเป็นต้องมีสถานะที่เปลี่ยนแปลงได้
Jørgen Fogh

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

6

วิธีการคงที่เร็วกว่าวิธีที่ไม่คงที่ดังนั้นใช่ควรเป็นแบบคงที่หากทำได้และไม่มีเหตุผลพิเศษในการปล่อยให้เป็นแบบคงที่


3
นั่นเป็นความจริงในทางเทคนิค แต่ไม่ใช่ในความหมายที่แท้จริง ความแตกต่างระหว่างคงที่ / ไม่จะมากน้อยมากเป็นปัจจัยในประสิทธิภาพ
Foredecker

22
-1: ตำราการเพิ่มประสิทธิภาพก่อนกำหนด ความเร็วไม่ควรเป็นเกณฑ์แรกอย่างแน่นอนในการตัดสินใจแบบคงที่กับไม่คงที่สำหรับกรณีทั่วไป
ไม่แน่ใจ

2
เห็นด้วยกับ Not Sure นี่ควรเป็นเหตุผลสุดท้ายของคุณในการพิจารณาคงที่เทียบกับไม่
Samuel

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

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

5

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

เมื่อคุณเขียนโค้ดคุณควรเขียนเพื่อให้คุณเปิดเผยให้น้อยที่สุดเท่าที่จะเป็นไปได้และเพื่อให้คุณเข้าถึงได้น้อยที่สุด

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

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


4

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

เช่นเดียวกับที่ Michael กล่าวการเปลี่ยนแปลงในภายหลังจะทำลายรหัสที่ใช้อยู่

จากที่กล่าวมาดูเหมือนว่าคุณกำลังสร้างฟังก์ชันยูทิลิตี้ส่วนตัวสำหรับคลาสซึ่งในความเป็นจริงคงที่โดยการออกแบบ


4

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


2

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


ใช่ แต่ถ้าสักวันคุณต้องทำสิ่งนี้คุณสามารถทำให้มันไม่หยุดนิ่งได้เสมอ หรือฉันขาดอะไรไป?
Ray

1
@Ray - ฉันครอบคลุมสิ่งนี้ในคำตอบของฉัน คงที่เป็นไม่คงที่เป็นการเปลี่ยนแปลงที่ทำลายล้างดังนั้นผู้บริโภคทั้งหมดจำเป็นต้องได้รับการแก้ไข ไม่ใช่เรื่องใหญ่สำหรับโปรแกรมขนาดเล็ก แต่ถ้าเป็นไลบรารีเพื่อการบริโภคของผู้อื่นสิ่งนี้จะต้องคำนึงถึง
Michael

ไซต์การโทรทั้งหมดจะต้องเปลี่ยนจากการเรียกเมธอดแบบคงที่เป็นการเรียกฟังก์ชันสมาชิก
Brian Ensink

ขออภัยคุณเพิ่มสิ่งนั้นหลังจากความคิดเห็นของฉัน ในใจของฉันฉันกำลังคิดถึงวิธีการส่วนตัว แต่นั่นเป็นประเด็นที่ถูกต้องสำหรับวิธีการสาธารณะ
Ray

... หรือบางวันคุณสามารถโยนมันออกไป ข้อโต้แย้งเหล่านี้ไม่ดีพอสำหรับฉันที่จะสร้างวิธีการที่ไม่คงที่
agnieszka

2

โดยส่วนตัวแล้วฉันไม่มีทางเลือกอื่นนอกจากทำให้มันคงที่ Resharper จะออกคำเตือนในกรณีนี้และ PM ของเรามีกฎ "No Warning from the Resharper"


1
คุณสามารถเปลี่ยนการตั้งค่า ReSharper ได้: P
Bernhard Hofmann

1
ถ้ามันง่ายขนาดนี้เราก็ไม่มีการสวมใส่จาก Resharper ... เลยทีเดียว :)
Prankster

1

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


1

คุณควรคิดถึงวิธีการและชั้นเรียนของคุณ:

  • คุณจะใช้มันอย่างไร?
  • คุณต้องการการเข้าถึงจำนวนมากจากระดับต่างๆของรหัสของคุณหรือไม่?
  • นี่เป็นวิธีการ / คลาสที่ฉันสามารถใช้ได้ในเกือบทุกโครงการที่คิดได้

ถ้าสองข้อสุดท้ายคือ 'ใช่' แสดงว่าเมธอด / คลาสของคุณน่าจะคงที่

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

อีกตัวอย่างที่ดีคือReverse()วิธีการใน C #
นี่เป็นวิธีการคงที่ในArrayคลาส มันกลับลำดับอาร์เรย์ของคุณ

รหัส:

public static void Reverse(Array array)

มันไม่ส่งคืนอะไรเลยอาร์เรย์ของคุณจะถูกย้อนกลับเนื่องจากอาร์เรย์ทั้งหมดเป็นอินสแตนซ์ของคลาส Array


คณิตศาสตร์เป็นตัวอย่างที่ไม่ดี ฉันเดาว่ามันดีกว่า: newnumber = number.round (2) กว่า newnumber = Math.round (number)
graffic

3
คลาสคณิตศาสตร์เป็นตัวอย่างที่สมบูรณ์แบบของการใช้คลาสแบบคงที่ นั่นคือสิ่งที่หัวข้อนี้เกี่ยวกับไม่เกี่ยวกับการที่คุณชอบปัดตัวเลข ...
KdgDev

1

ตราบเท่าที่คุณสร้างวิธีการใหม่แบบคงที่มันไม่ใช่การเปลี่ยนแปลงที่ทำลาย ในความเป็นจริง FxCop รวมคำแนะนำนี้ไว้เป็นหนึ่งในกฎ ( http://msdn.microsoft.com/en-us/library/ms245046(VS.80).aspx ) พร้อมข้อมูลต่อไปนี้:

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

ดังที่กล่าวไว้ความคิดเห็นแรกจาก David Kean สรุปข้อกังวลได้อย่างรวบรัดมากขึ้นโดยกล่าวว่านี่เป็นเรื่องที่ถูกต้องมากกว่าเกี่ยวกับการเพิ่มประสิทธิภาพ:

แม้ว่ากฎนี้จะถูกจัดประเภทเป็นปัญหาด้านประสิทธิภาพ แต่การปรับปรุงประสิทธิภาพของการสร้างเมธอดคงอยู่ที่ประมาณ 1% เท่านั้น แต่เป็นปัญหาด้านความถูกต้องมากกว่าที่อาจบ่งบอกถึงความไม่สมบูรณ์หรือข้อบกพร่องในสมาชิกจากความล้มเหลวในการใช้สมาชิกอินสแตนซ์อื่น ๆ การทำเครื่องหมายวิธีการแบบคงที่ ( ใช้ร่วมกันใน Visual Basic) ทำให้ชัดเจนในความตั้งใจที่จะไม่สัมผัสสถานะอินสแตนซ์


1

ฉันจะเปลี่ยนทุกอย่างที่ทำได้อย่างแน่นอนด้วยเหตุผลอื่น:

ฟังก์ชันคงที่เมื่อ JIT เรียกว่าไม่มีพารามิเตอร์ "this" นั่นหมายความว่าตัวอย่างเช่นฟังก์ชัน 3 พารามิเตอร์ที่ไม่คงที่ (เมธอดสมาชิก) จะถูกพุชด้วยพารามิเตอร์ 4 ตัวบนสแต็ก

ฟังก์ชันเดียวกันที่คอมไพล์เป็นฟังก์ชันคงที่จะถูกเรียกโดยใช้พารามิเตอร์ 3 ตัว สิ่งนี้สามารถเพิ่มการลงทะเบียนสำหรับ JIT และประหยัดพื้นที่สแต็ก ...


1

ฉันอยู่ในค่าย "only make private method static" การสร้างวิธีการสาธารณะสามารถแนะนำการมีเพศสัมพันธ์ที่คุณไม่ต้องการและอาจลดความสามารถในการทดสอบ: คุณไม่สามารถหยุดวิธีการคงที่สาธารณะได้

หากคุณต้องการทดสอบหน่วยวิธีที่ใช้วิธีการแบบคงที่สาธารณะคุณต้องทดสอบวิธีการคงที่เช่นกันซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ


1

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

ฉันโทรไปที่ธนาคารและขอยอดเงิน
พวกเขาขอหมายเลขบัญชีของฉัน
พอใช้. วิธีการอินสแตนซ์

ฉันโทรหาธนาคารของฉันและขอที่อยู่ทางไปรษณีย์
พวกเขาขอหมายเลขบัญชีของฉัน
WTF? ล้มเหลว - ควรเป็นวิธีการคงที่


1
จะเป็นอย่างไรหากลูกค้าต่างสาขาได้รับบริการ การติดต่อทางไปรษณีย์ไปยังสำนักงานใหญ่ของธนาคารอาจส่งไปยังสาขาที่เหมาะสมในที่สุด แต่นั่นไม่ได้หมายความว่าลูกค้าจะไม่ได้รับการบริการที่ดีขึ้นโดยใช้ที่อยู่ของสาขาที่ให้บริการเขา
supercat

0

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


-1

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

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