วิธีการรักษารหัสเศษเล็กเศษน้อยที่เหมือนกันในหลายโครงการ [ปิด]


9

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


นั่นไม่ใช่คำถามจริงหรือ?
Andre Figueiredo

คำตอบ:


15

แยกรหัสที่ใช้ร่วมกันออกเป็นห้องสมุดและรวมถึงห้องสมุดในโครงการ

ในฐานะนักพัฒนา Android คุณคงใช้ Java พิจารณาการใช้เครื่องมือการจัดการการพึ่งพาเช่นMavenหรือไอวี

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


2
+1 สำหรับการจัดการการพึ่งพา ควรมีตัวเลือกที่เหมาะสมสำหรับภาษายอดนิยมทั้งหมด
Adrian Schneider

11

การควบคุมเวอร์ชัน Git Git Submodules

วางโครงการของคุณภายใต้การควบคุมเวอร์ชันโดยใช้ dvcs เช่น git หรือ mercurial เป็นต้นใส่รหัสที่ใช้ร่วมกันใน submodule ใน git ใช้ submodule ในโครงการที่ต้องการ เมื่อคุณอัปเดต submodule สามารถดึงการเปลี่ยนแปลงไปยังโครงการอื่น ๆ ด้วยคำสั่งเดียว


1
-1: นี่คือ "การโปรโมตแบบ evangelical" ของผลิตภัณฑ์โดยเฉพาะอย่างยิ่งในการปลอมคำตอบของคำถาม ฉันเริ่มโหวตคำตอบนี้ แต่เมื่ออ่านคำถามอีกครั้งตัดสินใจว่าคำตอบนั้นเป็นคำตอบที่ถูกต้องสำหรับคำถามอื่น
mattnz

1
-1 เช่นกัน ฉันสับสนในเรื่องนี้ดีกว่าห้องสมุดสาธารณะอย่างไร ดูเหมือนว่าแค่การใช้คอมไพล์อย่างไม่ถูกต้องเพราะคุณปฏิเสธที่จะสร้างห้องสมุด
TheLQ

5
git เป็นเพียงเครื่องมือที่ใช้ ฉันใช้มันฉันมีความสุขกับมัน คุณสามารถใช้มันหรือปฏิเสธที่จะใช้มัน ความจริงก็คือมันแก้ปัญหาได้ ฉันไม่ได้อ้างว่านี่เป็นวิธีแก้ปัญหาเท่านั้น
Hakan Deryal

1
สิ่งนี้อธิบายถึงวิธีการทำงาน: การแยกไลบรารีร้องของานบางอย่างซึ่งอาจเป็นไปได้หรือไม่สามารถทำได้ภายใต้ข้อ จำกัด เวลาของ OP ดังนั้นวิธีการนี้จึงมีข้อดี
Francesco

2
+1 ขอบคุณสำหรับลิงค์! หากองค์ประกอบที่ใช้ร่วมกันอยู่ภายใต้การพัฒนาที่ใช้งานอยู่โซลูชันนี้มีประโยชน์อย่างเห็นได้ชัด (IMHO) เมื่อเปรียบเทียบกับโซลูชันไลบรารีที่ใช้ร่วมกัน
JanDotNet

5

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

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

ตอนนี้นี่คือที่มาของดาบ ...

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

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

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

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

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

ข้อเสนอแนะน้อยฉันสามารถนำเสนอ:

  1. การมีรหัสทั่วไปที่ครอบคลุมโดยการทดสอบหน่วยอัตโนมัติสามารถไปได้ไกลและทำให้คุณรู้สึกว่าเมื่อคุณทำการเปลี่ยนแปลงคุณไม่เพียงแค่ทำลายโครงการอื่น ๆ
  2. ฉันจะวางฟังก์ชันการทำงานที่มั่นคงมากไว้ในรหัสทั่วไปเท่านั้น หากคุณเขียนชั้นเรียนเมื่อปีที่แล้วเพื่อทำการจัดการตัวจับเวลาและคุณไม่ได้เปลี่ยนมันใน 9 เดือนและตอนนี้คุณมี 3 โครงการอื่น ๆ ที่ต้องใช้ตัวจับเวลาตรวจสอบให้แน่ใจว่านั่นเป็นตัวเลือกที่ดี แต่ถ้าคุณเพิ่งเขียนอะไรบางอย่างเมื่อสัปดาห์ที่แล้วดี ... คุณไม่มีตัวเลือกมากมาย (และฉันเกลียดการคัดลอก / วางรหัสอาจมากกว่าผู้ชายคนต่อไป) แต่ฉันคิดว่าสองครั้งที่ทำให้มันเป็นเรื่องธรรมดา
  3. หากชิ้นส่วนของรหัสเป็นเรื่องเล็กน้อย แต่คุณเคยใช้มันในหลาย ๆ ที่บางทีมันอาจจะดีกว่าถ้ากัดกระสุนทิ้ง DRY ไว้คนเดียวแล้วปล่อยให้สำเนาหลายเล่มมีชีวิต
  4. บางครั้งมันจ่ายเพื่อไม่เพียงแค่ใส่รหัสทั่วไปในที่ตั้งทั่วไปและให้ทุกคนอ้างอิง แต่ให้ถือว่ารหัสทั่วไปเป็นของตัวเอง releasable กับรุ่นวันที่ปล่อยและทุกอย่าง วิธีนี้โครงการ C สามารถพูดว่า "ฉันใช้ไลบรารีทั่วไป v1.3" และหากโครงการ D ต้องการฟังก์ชันใหม่คุณปล่อยให้ v1.3 อยู่คนเดียวปล่อย v1.4 และโครงการ C จะไม่ได้รับผลกระทบ โปรดทราบว่ามันมีราคาแพงกว่ามากในการใช้รหัสทั่วไปเป็นผลิตภัณฑ์ของตัวเองมากกว่าเพียงแค่ตรวจสอบในที่ตั้งทั่วไป

1

นี่เป็นทางออกในอุดมคติและอาจต้องใช้ความพยายามในการทำงาน

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

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

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

:-)

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

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

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

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