วิธีที่มีประสิทธิภาพที่สุดในการแบ่งปันรหัสระหว่างแอปพลิเคชัน. NET คืออะไร


15

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

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

สมมติว่าเรากำลังทำงานในโครงการ A และเราเพิ่มคุณสมบัติใหม่ที่ต้องมีการเปลี่ยนแปลงในมูลนิธิ เราทำการเปลี่ยนแปลงรากฐาน (Foundation-A) และผลักดันพวกเขาออกไปยังฟีด nuget เป็นแพ็กเกจที่ไม่เสถียร Project A ได้รับแพ็คเกจ nuget ล่าสุดและทั้งหมดนั้นดี ในขณะเดียวกันผู้พัฒนารายอื่นกำลังทำงานในโครงการ B. เขาได้รับพื้นฐานล่าสุดจากการควบคุมแหล่ง แต่นำมาจากสาขาที่มีเสถียรภาพดังนั้นจึงไม่มีการเปลี่ยนแปลงโครงการ A เขาทำการเปลี่ยนแปลงและสร้าง Foundation-B และทุกอย่างก็ดี แต่จากนั้นเราค้นพบว่าฟังก์ชันการใช้งาน Foundation-A และ Foundation-B ที่สามารถแบ่งปันรหัสได้จริงดังนั้นเราจึงรวมมันเข้าด้วยกัน ในขณะเดียวกัน Foundation-C ก็กำลังลอยอยู่ที่นั่นด้วยการเปลี่ยนแปลงของมันเอง ในที่สุด Foundation-B ก็พร้อมสำหรับการผลิตดังนั้นเราจึงผลักมันออกไป แต่เราจำเป็นต้องอัพเดทการผลิต A, B

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

นี่คือสแต็คที่เราใช้: C #, TFS พร้อมการรวมต่อเนื่อง, Nuget แอปพลิเคชันของเราเป็นแอปพลิเคชัน ASP.NET ทุกประเภท เรายินดีที่จะดู SCM ที่แตกต่างกันถ้ามันจะทำให้สิ่งต่าง ๆ ง่ายขึ้น

ฉันกำลังมองหาวิธีที่จะรักษา Nuget sane ด้วยรหัสแหล่งต่าง ๆ ของเรา เราไม่ต้องการที่จะผลักดันรหัสการพัฒนาไปสู่การผลิตโดยไม่ตั้งใจเพราะเราอ้างอิงแพคเกจ Nuget ที่ไม่ถูกต้อง


นอกจากนี้หากนี่ไม่ใช่ฟอรัมที่ดีสำหรับการอภิปรายเช่นนี้ใครสามารถแนะนำคนที่ดีกว่าได้หรือไม่
Josh

คำตอบ:


9

เราทำการเปลี่ยนแปลงรากฐาน (Foundation-A) และผลักดันพวกเขาออกไปยังฟีด nuget เป็นแพ็กเกจที่ไม่เสถียร

นี่คือสิ่งที่ปัญหาของคุณเริ่มต้น ... อย่าทำอย่างนั้น

การเปลี่ยนแปลงใด ๆ ที่ทำกับมูลนิธิ v1.0 ควรเป็นประโยชน์ต่อผู้บริโภคทุกคนของมูลนิธิมิเช่นนั้นจะไม่ได้อยู่ในมูลนิธิ ดังนั้นเมื่อสร้างแพ็คเกจ nuget ให้ทำในรูปแบบ Foundation รุ่นเสถียร (เช่น v1.1) หรือไม่ทำเลย

โครงการ B ควรสร้างการปรับปรุงพื้นฐานของมูลนิธิตามปกติ แต่ (ในรูปแบบการจัดการแหล่งข้อมูลที่ดี) ควรผสานในการเปลี่ยนแปลงลำตัว (v1.1) ก่อนที่จะผลักดันรากฐานที่มั่นคง (v1.2) ไปยัง nuget

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

ฉันเห็นด้วยกับ@Giedrius ; นี่ดูเหมือนว่าฉันจะเป็นปัญหาการควบคุมแหล่งที่มา / การแตกแขนงมากกว่าในแง่ที่ว่าหากการจัดการการแยก / การผสานของมูลนิธิถูกจัดการอย่างเหมาะสมปัญหาการจัดการแพคเกจจะกลายเป็นสิ่งที่สงสัย


ใช่มันสมเหตุสมผลแล้ว ปัญหาอยู่ในการใช้งานจริง เมื่อคุณอัพเดต Foundation for v1.1 คุณต้องการใช้การเปลี่ยนแปลงเหล่านั้นใน Project B ขณะที่คุณกำลังพัฒนา หากวิธีที่คุณแชร์รหัสนั้นผ่าน nuget ตัวเลือกของคุณคือ: 1) เผยแพร่แพ็คเกจ nuget ใหม่หรือ 2) คัดลอก dll ด้วยตนเอง ทั้งสองอย่างดูเหมือนตัวเลือกที่ดี
Josh

บางส่วนนี้สามารถลดลงได้โดยการมีชุดทดสอบที่มีประสิทธิภาพ แต่ยังคงมีการไปมาในขณะที่คุณเพิ่มคุณสมบัติ
Josh

@ Josh ใช่การอัปเดตของ Foundation ควรจะเสร็จสมบูรณ์และสามารถทดสอบได้โดยไม่ขึ้นกับว่าโครงการ B จะใช้อย่างไร อย่านำเข้าและใช้ Foundation v.Next ในโครงการ B จนกว่าจะเป็นแพคเกจที่เสถียรใน nuget มันต้องใช้วินัยเล็กน้อย แต่ก็ดีกว่าการทำอย่างอื่นเสียอีก
Eric King

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

2
เมื่อเราทำเช่นนี้มาหลายเดือนนี่เป็นสิ่งที่เราตัดสิน ฉันคิดว่าฉันกังวลเกินไปเกี่ยวกับกระบวนการที่เป็นทางการ เมื่อเราเริ่มทำงานจริง ๆ แล้วสิ่งต่าง ๆ ก็จบลงอย่างราบรื่น ขอบคุณสำหรับข้อมูลของคุณ
Josh

4

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

อย่าลืมว่ารหัสที่ซ้ำกันทั้งหมดนั้นไม่ได้ซ้ำกันจริงๆ บางส่วนเป็นรหัสกาวหรือรหัสที่จำเป็นอย่างอื่นสำหรับการค้ำจุนสถาปัตยกรรมดังนั้นอย่ามัวเมากับการเป็น DRY


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

ฉันเห็นด้วยกับ Eric King ควรวางรหัสพื้นฐานเป็นรุ่นที่เสถียรไม่ใช่รหัสที่ไม่เสถียร กุญแจสำคัญคือการรักษา API ที่เสถียร: ถ้าคุณรู้ว่าลายเซ็นของวิธีการพื้นฐานของคุณจะไม่เปลี่ยนแปลงคุณสามารถผลักดันวิธีการไปยังมูลนิธิและปลอดภัยในภายหลังโดยไม่ทำลายอะไรเลย
Robert Harvey

4

การใช้รหัสซ้ำ

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

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

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

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

ผู้จัดการ NuGET

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


1

ฉันคิดว่าปัญหาไม่ได้อยู่ใน nuget / source control / branching แต่ในสิ่งที่หลุดเข้าไปในรหัสการติดกาว

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

http://ayende.com/blog/3986/let-us-burn-all-those-pesky-util-common-l ไลบรารี http://blog.jordanterrell.com/post/CommonUtility-Library-Dead.aspx

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


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

0

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

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

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