การประกาศอินเตอร์เฟสในไฟล์เดียวกับคลาสพื้นฐานมันเป็นการปฏิบัติที่ดีหรือไม่?


29

เพื่อให้สามารถเปลี่ยนได้และทดสอบได้ปกติบริการที่มีตรรกะต้องมีส่วนต่อประสานเช่น

public class FooService: IFooService 
{ ... }

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

ฉันคิดว่าการเขียน IFooService ในไฟล์เดียวกับ FooService จะลดความแปลกประหลาดข้างต้น ท้ายที่สุด IFooService และ FooService มีความเกี่ยวข้องกันมาก นี่เป็นวิธีปฏิบัติที่ดีหรือไม่? มีเหตุผลที่ดีที่ IFooService จะต้องอยู่ในไฟล์ของตัวเองหรือไม่?


3
หากคุณมีการใช้งานอินเทอร์เฟซเฉพาะเพียงครั้งเดียวก็ไม่จำเป็นต้องใช้ตรรกะในการใช้งานจริง ทำไมไม่ใช้คลาสโดยตรง
Joris Timmermans

11
@MadKeithV สำหรับข้อต่อหลวม ๆ และทดสอบได้หรือไม่
Louis Rhys

10
@MadKeithV: คุณถูกต้อง แต่เมื่อคุณเขียนทดสอบหน่วยรหัสที่อาศัย IFooService คุณมักจะให้ MockFooService ซึ่งเป็นการดำเนินงานที่สองของอินเตอร์เฟซที่
Doc Brown

5
@DocBrown - หากคุณมีการใช้งานหลาย ๆ ครั้งความคิดเห็นจะหายไปอย่างเห็นได้ชัด แต่ยูทิลิตี้ของการสามารถไปที่ "การใช้งานครั้งเดียว" ได้โดยตรง (เพราะมีอย่างน้อยสอง) จากนั้นคำถามจะกลายเป็น: ข้อมูลใดบ้างในการใช้งานอย่างเป็นรูปธรรมซึ่งไม่ควรอยู่ในคำอธิบาย / เอกสารประกอบของอินเทอร์เฟซ ณ จุดที่คุณใช้อินเทอร์เฟซ
Joris Timmermans

1
โฆษณาตัวเองอย่างโจ่งแจ้ง: stackoverflow.com/questions/5840219/…
Marjan Venema

คำตอบ:


24

มันไม่จำเป็นต้องอยู่ในไฟล์ของตัวเอง แต่ทีมของคุณควรเลือกมาตรฐานและยึดมันไว้

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

 


5
ฉันเห็นด้วยกับคำตอบนี้หลังจากที่ทุก IDE ควรปรับให้เข้ากับการออกแบบของเราและไม่ใช่วิธีอื่น ๆ ใช่ไหม?
marktani

1
นอกจากนี้หากไม่มี Resharper, F12 และ Shift + F12 ก็ทำเช่นเดียวกัน ไม่แม้แต่คลิกขวา :) (เพื่อความเป็นธรรมมันจะนำคุณไปสู่การใช้งานอินเทอร์เฟซโดยตรงเท่านั้นไม่แน่ใจว่าเวอร์ชั่น Resharper ทำอะไร)
Daniel B

@DanielB: ใน Resharper Alt-End จะไปที่การนำไปใช้ (หรือนำเสนอรายการการปรับใช้ที่เป็นไปได้ให้คุณ)
StriplingWarrior

@StriplingWarrior แล้วดูเหมือนว่ามันเป็นสิ่งที่วานิลลา VS ทำเช่นกัน F12 = ไปที่คำจำกัดความ Shift + F12 = ไปที่การนำไปใช้ (ฉันค่อนข้างแน่ใจว่ามันใช้งานได้โดยไม่ต้อง Resharper ถึงแม้ว่าฉันติดตั้งแล้ว แต่ก็ยากที่จะยืนยัน) มันเป็นหนึ่งในทางลัดนำทางที่มีประโยชน์ที่สุดฉันแค่กระจายคำศัพท์
Daniel B

@DanielB: ค่าเริ่มต้นสำหรับ Shift-F12 คือ "find usages" jetbrains.com/resharper/webhelp/…
StriplingWarrior

15

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


10

ตาม SOLID ไม่เพียง แต่คุณควรสร้างส่วนต่อประสานและไม่เพียง แต่ควรอยู่ในไฟล์ที่แตกต่าง แต่ควรอยู่ในชุดประกอบอื่น

ทำไม? เนื่องจากการเปลี่ยนแปลงใด ๆ กับไฟล์ต้นฉบับที่คอมไพล์ในแอสเซมบลีต้องมีการคอมไพล์ใหม่ของแอสเซมบลีและการเปลี่ยนแปลงใด ๆ ในแอสเซมบลีต้อง recompilation ของแอสเซมบลีใด ๆ ดังนั้นหากเป้าหมายของคุณที่มีพื้นฐานมาจาก SOLID นั้นจะสามารถแทนที่การใช้งาน A ด้วยการนำไปใช้ B ได้ในขณะที่คลาส C ขึ้นอยู่กับส่วนต่อประสานที่ฉันไม่จำเป็นต้องทราบถึงความแตกต่าง ในมันไม่เปลี่ยนแปลงดังนั้นปกป้องประเพณี

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

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


8

ทำไมการมีไฟล์แยกต่างหากทำให้รู้สึกไม่สบาย? สำหรับฉันมันเป็นสิ่งที่ดีและสะอาดกว่ามาก เป็นเรื่องปกติที่จะสร้างโฟลเดอร์ย่อยชื่อ "Interfaces" และติดไฟล์ IFooServer.cs ของคุณไว้ที่นั่นหากคุณต้องการดูไฟล์น้อยลงใน Solution Explorer ของคุณ

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


6

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

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

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


3
+1 สำหรับการชี้ให้เห็นว่าการปฏิบัติของทีมควรกำหนดโครงสร้างของไฟล์และสำหรับการขัดกับแนวทางปกติ

3

มีหลายครั้งที่คุณต้องการให้อินเทอร์เฟซของคุณไม่เพียง แต่ในไฟล์แยกไปยังคลาส แต่ยังอยู่ในแอสเซมบลีที่แยกต่างหากทั้งหมด

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


2

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

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

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


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


3
ในความเป็นจริงมันเป็นรูปแบบที่ค่อนข้างปกติที่จะมีหนึ่งอินเทอร์เฟซสำหรับหนึ่งคลาสใน. NET ในขณะที่มันช่วยให้การทดสอบหน่วยเพื่อทดแทนการพึ่งพากับ mocks, stubs, spys หรือการทดสอบอื่น ๆ เป็นสองเท่า
Pete

2
@Pete ฉันแก้ไขคำตอบของฉันเพื่อรวมไว้ในบันทึกย่อ ฉันจะไม่เรียกรูปแบบนี้ว่า "ปกติ" เพราะมันจะทำให้ความกังวลเกี่ยวกับการทดสอบของคุณ "รั่ว" ลงในฐานรหัสหลักของคุณ กรอบการเยาะเย้ยสมัยใหม่ช่วยให้คุณเอาชนะปัญหานี้ได้ในระดับใหญ่ แต่การมีส่วนต่อประสานที่นั่นทำให้สิ่งต่าง ๆ ง่ายขึ้นอย่างมาก
dasblinkenlight

2
@KeithS คลาสที่ไม่มีอินเทอร์เฟซควรอยู่ในการออกแบบของคุณเฉพาะเมื่อคุณตายแน่นอนว่ามันไม่มีความหมายใด ๆ ที่จะซับคลาสนั้นและคุณสร้างคลาสsealedนั้น หากคุณสงสัยว่าในบางครั้งในอนาคตคุณอาจเพิ่มคลาสย่อยที่สองคุณต้องใส่อินเทอร์เฟซทันที PS ผู้ช่วย refactoring คุณภาพดีสามารถเป็นของคุณได้ในราคาที่พอเหมาะสำหรับใบอนุญาต ReSharper ใบเดียว :)
dasblinkenlight

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

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

2

อินเทอร์เฟซเป็นของลูกค้าของพวกเขาที่จะไม่ดำเนินการตามที่กำหนดไว้ในหลักการเปรียววิธีปฏิบัติและรูปแบบโดย Robert C. Martin ดังนั้นการรวมอินเทอร์เฟซและการนำไปใช้ในที่เดียวกันมันขัดกับหลักการของมัน

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

ปรับปรุง: นี่ไม่ใช่หลักการเดียวที่คล่องตัวที่นี่ Gang of Four ในรูปแบบการออกแบบย้อนกลับไปในปี '94 กำลังพูดถึงไคลเอนต์ที่ยึดมั่นกับอินเตอร์เฟสและการโปรแกรมไปยังอินเตอร์เฟส มุมมองของพวกเขาคล้ายกัน


1
การใช้อินเทอร์เฟซนั้นดีกว่าโดเมนที่ Agile ครอบครองอยู่ Agile เป็นวิธีการพัฒนาที่ใช้ภาษาสร้างในรูปแบบเฉพาะ อินเทอร์เฟซเป็นโครงสร้างภาษา

1
ใช่ แต่อินเทอร์เฟซยังคงเป็นของไคลเอ็นต์และไม่ใช่การใช้งานโดยไม่คำนึงถึงความจริงที่ว่าเรากำลังพูดถึงความคล่องตัวหรือไม่
Patkos Csaba

ฉันอยู่กับคุณในเรื่องนี้
Marjan Venema

0

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


2
ในฐานะผู้ใช้ฉันต้องการทราบว่าประเภทนั้นเป็นอินเทอร์เฟซหรือไม่เพราะตัวอย่างเช่นมันหมายความว่าฉันไม่สามารถใช้newกับมันได้ แต่ในทางกลับกันฉันสามารถใช้มันร่วมหรือตรงกันข้ามได้ และการIประชุมตั้งชื่อที่จัดตั้งขึ้นใน. Net ดังนั้นจึงเป็นเหตุผลที่ดีที่จะปฏิบัติตามหากเพียงเพื่อความสอดคล้องกับประเภทอื่น ๆ
svick

การเริ่มต้นด้วยIอินเทอร์เฟซเป็นการแนะนำข้อโต้แย้งของฉันเกี่ยวกับการแยกเป็นสองไฟล์ รหัสนั้นสามารถอ่านได้ดีขึ้นและทำให้การผกผันของการอ้างอิงชัดเจนขึ้น
ollins

4
ชอบหรือไม่การใช้ 'I' ด้านหน้าชื่ออินเทอร์เฟซเป็นมาตรฐานแบบไม่ต้องทำใน. NET การไม่ปฏิบัติตามมาตรฐานในโครงการ. NET ในมุมมองของฉันจะเป็นการละเมิด 'หลักการของความประหลาดใจอย่างน้อย'
Pete

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

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

0

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


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

0

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

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

โดยส่วนตัวถ้าฉันเจอ codebase ซึ่งใช้การประชุมหนึ่งมากกว่าอีกฉันจะไม่กังวลเกินไปทั้งสองวิธี


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