ห้ามการเรียกฟังก์ชั่น / คลาสโดยพลการในรหัสภายนอก


12

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

ตัวอย่างเช่นในแอปพลิเคชัน SharePoint อาจดูเหมือนเป็นเรื่องปกติที่จะเรียกspList.Items.GetItemByIdเพื่อรับรายการแม้ในวงวนโดยไม่ทราบว่าสิ่งนี้สามารถนำไปสู่ปัญหาประสิทธิภาพการทำงานขนาดใหญ่ได้

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

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


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

3
คุณหวังที่จะจับและบล็อกการโทรเหล่านี้เป็นเวลารันไทม์หรือคอมไพล์หรือไม่?
MetaFight

1
เมื่อคุณใช้ C # คุณเคยได้ยินเกี่ยวกับStyleCopหรือไม่ คุณรู้หรือไม่ว่าคุณสามารถสร้างกฎที่กำหนดเองได้ตามต้องการ
Machado

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

3
@ Machado, StyleCop เป็นผลิตภัณฑ์ที่มีประสิทธิภาพ มันถูกแทนที่ด้วย StyleCopAnalyzers ซึ่งสร้างขึ้นบน Roslyn มันจะไม่เป็นความคิดที่ดีที่จะลงทุนเวลาในการเขียนกฎ StyleCop แบบกำหนดเองในปัจจุบัน
David Arno

คำตอบ:


8

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

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

ชุดตัวอย่างของตัววิเคราะห์ที่ให้รหัสตัวอย่างจำนวนมากเกี่ยวกับการเขียนของคุณเองคือStyleCop Analyzersซึ่งเป็นการแทนที่คุณลักษณะเก่าของ StyleCop สำหรับ C #

ต้องบอกว่าการตรวจสอบอัตโนมัติดังกล่าวสามารถแก้ไขได้โดยชาวบ้านที่มุ่งมั่นที่จะ "ทำลายกฎ" ดังนั้นวิธีการนี้จึงไม่สามารถทดแทนการตรวจสอบโค้ดตามที่กล่าวไว้ในคำตอบของ Karl Bielefeldt สามารถช่วยในการตรวจสอบดังกล่าว แต่ไม่ควรแทนที่


มันไม่เคยมีความตั้งใจที่จะแทนที่สิ่งอื่นใดฉันแค่ค้นหาเครื่องมือพิเศษสำหรับกล่องเครื่องมือของฉัน
Alex

25

คุณสามารถทำสิ่งที่ต้องใช้เวลานานเช่นเขียน wrapper รอบ ๆ API ภายนอกที่ทำให้การทำงานที่ไม่ต้องการของคุณหมดไป แต่ไม่มีการฝึกเต้นและรีวิวรหัสเพราะอะไรก็ตามที่คุณใส่ไว้ในมาตรฐานหรือมาตรการทางเทคนิค .

ตัวอย่างเช่นเรามีบริการต่างๆที่เขียนในสกาล่าและเป็นหนึ่งในสิ่งที่เราถามในเวลาตรวจสอบรหัสสำหรับการเปลี่ยนไม่ได้ varsแต่เรามักจะสื่อสารว่าการกำจัด บางวันก่อนหน้านี้ใช้val x: ListBuffer [Boolean]เพื่อเก็บตัวแปรที่ไม่แน่นอนเพียงตัวเดียวเป็นรายการเดียวในรายการ คุณไม่สามารถกำหนดให้กับอีกListBufferx แต่คุณสามารถแทนที่รายการของรายการในสถานที่ได้มากเท่าที่คุณต้องการ ไม่ดีเท่าการใช้งานvarแต่ก็ดื้อรั้น

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


เจ้ากรรมที่ส่อเสียด!
WHN

@snb เทียบเท่ากับสิ่งที่ Java ทำเช่นเดียวกับการแฮ็คเพื่อให้สามารถส่งคืนวัตถุ / ค่าเดียวเท่านั้นและไม่มีข้อโต้แย้งอ้างอิงที่เหมาะสม ผ่านอาร์เรย์แทนที่จะมีการอัปเดตเนื้อหา (ตัวอย่างบางส่วน: AtomicMarkableReference.getและAtomicStampedReference.get)
JAB

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

1
@Alex ทางออกที่ง่ายที่สุดอยู่ที่นั่น: "ไม่มีอะไรเต้นการฝึกอบรมและความคิดเห็นรหัส"
Mr.Mindor

2
"ไม่มีอะไรเต้นด้วยตนเอง" ถูกต้องจนกว่าจะมีคนทำโดยอัตโนมัติ
Ewan

0

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

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

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

คัดลอก / วางโดยตรงจากหน้า Wikipedia ใช้หน้า wiki สำหรับข้อมูลและลิงค์ล่าสุด: https://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#.NET

  • .NET Compiler Platform (Codename Roslyn) - เฟรมเวิร์กคอมไพเลอร์โอเพนซอร์สสำหรับ C # และ Visual Basic .NET ที่พัฒนาโดย Microsoft .NET จัดเตรียม API สำหรับวิเคราะห์และจัดการกับไวยากรณ์
  • CodeIt.Right - รวมการวิเคราะห์โค้ดแบบคงที่และการปรับโครงสร้างอัตโนมัติใหม่เพื่อการปฏิบัติที่ดีที่สุดซึ่งช่วยให้การแก้ไขข้อผิดพลาดและการละเมิดรหัสโดยอัตโนมัติ รองรับ C # และ VB.NET
  • CodeRush - ปลั๊กอินสำหรับ Visual Studio ซึ่งแจ้งเตือนผู้ใช้ถึงการละเมิดแนวทางปฏิบัติที่ดีที่สุด
  • FxCop - การวิเคราะห์แบบคงที่ฟรีสำหรับโปรแกรม Microsoft .NET ที่คอมไพล์กับ CIL สแตนด์อโลนและรวมอยู่ใน Microsoft Visual Studio บางรุ่น โดย Microsoft
  • NDepend - ลดความซับซ้อนในการจัดการฐานรหัส. NET ที่ซับซ้อนโดยการวิเคราะห์และแสดงภาพการพึ่งพารหัสโดยการกำหนดกฎการออกแบบโดยทำการวิเคราะห์ผลกระทบและโดยการเปรียบเทียบรหัสรุ่นต่างๆ รวมเข้ากับ Visual Studio
  • Parasoft dotTEST - การวิเคราะห์แบบคงที่การทดสอบหน่วยและปลั๊กอินตรวจสอบโค้ดสำหรับ Visual Studio ทำงานร่วมกับภาษาสำหรับ Microsoft .NET Framework และ. NET Compact Framework รวมถึง C #, VB.NET, ASP.NET และ Managed C ++
  • Sonargraph - รองรับ C #, Java และ C / C ++ โดยเน้นการวิเคราะห์การพึ่งพาการตรวจสอบสถาปัตยกรรมอัตโนมัติเมตริกและความสามารถในการเพิ่มเมตริกที่กำหนดเองและตัวตรวจสอบโค้ด
  • StyleCop - วิเคราะห์ซอร์สโค้ด C # เพื่อบังคับใช้ชุดลักษณะและกฎความสอดคล้อง มันสามารถเรียกใช้จากภายในของ Microsoft Visual Studio หรือรวมเข้ากับโครงการ MSBuild

-1

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

สิ่งนี้สามารถ (และควร) รวมถึงขั้นตอนการตรวจสอบด้วยตนเองและอัตโนมัติ:

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

  • เพิ่มกฎการเช็คอินเพื่อค้นหารูปแบบที่รู้จัก สิ่งนี้อาจซับซ้อนในการเขียน แต่สำหรับโครงการขนาดใหญ่เมื่อเวลาผ่านไปอาจมีประโยชน์ TFS ช่วยให้คุณสามารถเขียนกฎใน C # และระบบบิลด์อื่น ๆ มี hooks ของตัวเอง พิจารณาใช้การสร้าง gated เพื่อปฏิเสธการเช็คอินที่ตรงกับรูปแบบ ใช่มันทำให้การพัฒนาช้าลง แต่หลังจากขนาดและความซับซ้อนของโครงการที่แน่นอนการลดความเร็วของ devs อาจเป็นสิ่งที่ดี


-1

บางทีคอมไพเลอร์สามารถช่วยคุณโทรติดต่อที่ไม่ต้องการได้

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

ผู้ใช้ lib ภายนอกจะได้รับวิธีการรวบรวมข้อผิดพลาด / คลาสที่ไม่พบ

คลาส / เมธอดที่ต้องห้ามจากไลบรารีสาธารณะ: สร้างเนมสเปซ / คลาส / เมธอดเดียวกันใน lib ของคุณ

ผู้ใช้ lib ภายนอกจะได้รับข้อผิดพลาดในการคอมไพล์เนื่องจากพบคลาสที่ซ้ำกัน

[อัพเดต]

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

บังคับให้โปรแกรมเมอร์ (... ไคลเอนต์ของ lib ... ) ใช้มาตรการเพื่อแทนที่ข้อ จำกัด เหล่านี้หากเป็นไปได้ / จำเป็น


การลดลงไม่ใช่เพราะแฮ็คที่น่ารังเกียจ แต่สามารถทำงานกับ C # ได้อย่างง่ายดาย (ซึ่ง OP ได้ติดแท็กคำถามด้วย) โดยใช้นามแฝงภายนอก
David Arno
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.