ในช่วงไม่กี่ปีที่ผ่านมาเราได้ค่อยๆเปลี่ยนไปใช้โค้ดที่ดีขึ้นอย่างค่อยเป็นค่อยไปในเวลาไม่กี่ก้าว ในที่สุดเราก็เริ่มที่จะเปลี่ยนไปใช้สิ่งที่คล้ายกับ SOLID อย่างน้อยที่สุด แต่เรายังไม่ถึงจุดนั้น นับตั้งแต่ทำการสลับหนึ่งในข้อร้องเรียนที่ใหญ่ที่สุดจากนักพัฒนาคือพวกเขาไม่สามารถยืนทบทวนและตรวจสอบไฟล์หลายสิบไฟล์ซึ่งก่อนหน้านี้ทุกงานต้องการเพียงผู้พัฒนาที่สัมผัส 5-10 ไฟล์
ก่อนที่จะเริ่มสวิตช์สถาปัตยกรรมของเราได้รับการจัดระเบียบอย่างดีดังต่อไปนี้ (ให้สิทธิ์โดยมีหนึ่งหรือสองไฟล์ที่มีขนาดมากกว่าหนึ่งคำสั่ง):
Solution
- Business
-- AccountLogic
-- DocumentLogic
-- UsersLogic
- Entities (Database entities)
- Models (Domain Models)
- Repositories
-- AccountRepo
-- DocumentRepo
-- UserRepo
- ViewModels
-- AccountViewModel
-- DocumentViewModel
-- UserViewModel
- UI
ไฟล์ฉลาดทุกอย่างเป็นเส้นตรงและกะทัดรัดอย่างเหลือเชื่อ เห็นได้ชัดว่ามีการทำสำเนารหัสจำนวนมากการมีเพศสัมพันธ์อย่างแน่นหนาและปวดหัวอย่างไรก็ตามทุกคนสามารถเข้าไปสำรวจและคิดออกได้ สามเณรที่สมบูรณ์ผู้ที่ไม่เคยเปิด Visual Studio มาก่อนสามารถเข้าใจได้ในเวลาไม่กี่สัปดาห์ การขาดความซับซ้อนของไฟล์โดยรวมทำให้ค่อนข้างตรงไปตรงมาสำหรับนักพัฒนามือใหม่และการจ้างงานใหม่ที่จะเริ่มมีส่วนร่วมโดยไม่ต้องเพิ่มเวลามากเกินไปเช่นกัน แต่นี่เป็นสิ่งที่ค่อนข้างดีสำหรับข้อดีของรูปแบบโค้ดที่ออกไปนอกหน้าต่าง
ฉันขอรับรองทุกครั้งที่เราพยายามทำให้ codebase ของเราดีขึ้น แต่มันก็เป็นเรื่องธรรมดามากที่จะได้รับการผลักดันกลับจากทีมอื่น ๆ ในการเปลี่ยนกระบวนทัศน์ขนาดใหญ่เช่นนี้ สองจุดที่ใหญ่ที่สุดในปัจจุบันคือ:
- ทดสอบหน่วย
- การนับชั้นเรียน
- ความซับซ้อนของเพื่อน
การทดสอบหน่วยเป็นการขายที่ยากอย่างเหลือเชื่อให้กับทีมเนื่องจากพวกเขาเชื่อว่าพวกเขาเสียเวลาและพวกเขาสามารถจัดการทดสอบโค้ดได้เร็วขึ้นมากโดยรวมกว่าแต่ละชิ้น การใช้การทดสอบหน่วยเป็นการรับรองสำหรับ SOLID ส่วนใหญ่ไร้ประโยชน์และส่วนใหญ่กลายเป็นเรื่องตลกที่จุดนี้
การนับชั้นเรียนเป็นสิ่งกีดขวางที่ใหญ่ที่สุดที่จะเอาชนะได้ ตอนนี้งานที่เคยถ่าย 5-10 ไฟล์สามารถใช้ 70-100! ในขณะที่ไฟล์เหล่านี้แต่ละไฟล์มีจุดประสงค์ที่แตกต่างกัน แต่ปริมาณไฟล์ที่แท้จริงอาจล้นหลาม การตอบสนองจากทีมส่วนใหญ่คร่ำครวญและเกาหัว ก่อนหน้านี้งานอาจต้องใช้ที่เก็บหนึ่งหรือสองแบบหรือสองแบบเลเยอร์ตรรกะและวิธีการควบคุม
ตอนนี้ในการสร้างแอปพลิเคชันการบันทึกไฟล์อย่างง่ายคุณมีคลาสที่จะตรวจสอบว่ามีไฟล์อยู่แล้วคลาสที่จะเขียนเมทาดาทาคลาสที่เป็นนามธรรมออกไปDateTime.Now
เพื่อให้คุณสามารถฉีดเวลาสำหรับการทดสอบหน่วย เพื่อให้มีการทดสอบหน่วยสำหรับแต่ละชั้นเรียนและหนึ่งไฟล์ขึ้นไปเพื่อเพิ่มทุกอย่างลงในคอนเทนเนอร์ DI ของคุณ
สำหรับการใช้งานขนาดเล็กถึงขนาดกลาง SOLID เป็นสินค้าที่ขายง่ายมาก ทุกคนเห็นประโยชน์และความสะดวกในการบำรุงรักษา อย่างไรก็ตามพวกเขาไม่เห็นคุณค่าที่ดีสำหรับ SOLID ในแอปพลิเคชันขนาดใหญ่มาก ดังนั้นฉันจึงพยายามหาวิธีในการปรับปรุงองค์กรและการจัดการเพื่อให้เราผ่านพ้นความเจ็บปวด
ฉันคิดว่าฉันจะยกตัวอย่างไฟล์วอลลุ่มให้มากขึ้นตามงานที่เพิ่งทำเสร็จ ฉันได้รับมอบหมายให้ใช้งานฟังก์ชั่นบางอย่างในหนึ่งใน Microservices รุ่นใหม่ของเราเพื่อรับคำขอซิงค์ไฟล์ เมื่อได้รับคำขอบริการจะดำเนินการค้นหาและตรวจสอบหลายชุดและในที่สุดจะบันทึกเอกสารลงในไดรฟ์เครือข่ายรวมถึงตารางฐานข้อมูลแยก 2 ตาราง
ในการบันทึกเอกสารลงในไดรฟ์เครือข่ายฉันต้องการคลาสเฉพาะสองสามคลาส:
- IBasePathProvider
-- string GetBasePath() // returns the network path to store files
-- string GetPatientFolderName() // gets the name of the folder where patient files are stored
- BasePathProvider // provides an implementation of IBasePathProvider
- BasePathProviderTests // ensures we're getting what we expect
- IUniqueFilenameProvider
-- string GetFilename(string path, string fileType);
- UniqueFilenameProvider // performs some filesystem lookups to get a unique filename
- UniqueFilenameProviderTests
- INewGuidProvider // allows me to inject guids to simulate collisions during unit tests
-- Guid NewGuid()
- NewGuidProvider
- NewGuidProviderTests
- IFileExtensionCombiner // requests may come in a variety of ways, need to ensure extensions are properly appended.
- FileExtensionCombiner
- FileExtensionCombinerTests
- IPatientFileWriter
-- Task SaveFileAsync(string path, byte[] file, string fileType)
-- Task SaveFileAsync(FilePushRequest request)
- PatientFileWriter
- PatientFileWriterTests
นั่นคือทั้งหมด 15 ชั้นเรียน (ไม่รวม POCOs และนั่งร้าน) เพื่อทำการบันทึกอย่างตรงไปตรงมา จำนวนนี้เพิ่มขึ้นอย่างมีนัยสำคัญเมื่อฉันต้องการสร้าง POCO เพื่อเป็นตัวแทนนิติบุคคลในระบบไม่กี่ระบบสร้าง repos สองสามตัวเพื่อสื่อสารกับระบบของบุคคลที่สามที่ไม่เข้ากันกับ ORM อื่น ๆ ของเราและวิธีการทางตรรกะที่สร้างขึ้นเพื่อจัดการความซับซ้อน