มันจะดีกว่าที่จะพึ่งพาพึ่งพาสกรรมกริยาหรือประกาศอย่างชัดเจน?


11

ฉันมีโครงสร้างโครงการเช่นนี้:

My Project
  - Other Team's Project
     -Third Party Dependency

My Projectต้องการOther Team's Projectฟังก์ชั่นและทั้งสองMy ProjectและOther Team's Projectจำเป็นต้องมีThird Party Dependencyฟังก์ชั่น เรากำลังใช้ระบบการจัดการการพึ่งพาเพื่อจัดการสิ่งเหล่านี้

จากมุมมองการออกแบบจะดีกว่าที่จะMy Projectพึ่งพาการขนส่งThird Party Dependencyหรือไม่ หรือมันจะดีกว่าสำหรับทั้งสองMy ProjectและOther Team's Projectทั้งสองอย่างชัดเจนประกาศว่าพวกเขาใช้Third Party Dependency?

สิ่งอื่น ๆ :

  • Third Party Dependencyทั้งสองโครงการจะต้องมีรุ่นเดียวกัน
  • ไม่รับประกันว่าหากOther Team's Projectได้รับการปรับปรุงที่My Projectจะถูกทดสอบเพื่อให้แน่ใจว่าไม่มีอะไรแตกเพราะได้รับการจัดการโดยทีมที่แตกต่างกัน

คำตอบ:


11

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

หากรหัสของคุณขึ้นอยู่กับโครงการอื่นเท่านั้นหากไม่ใช่รหัสของคุณก็ขึ้นอยู่กับห้องสมุดบุคคลที่สามด้วย

Third Party Dependencyทั้งสองโครงการจะต้องมีรุ่นเดียวกัน

นั่นเป็นตัวบ่งชี้ที่แข็งแกร่งว่าโครงการของคุณขึ้นอยู่กับห้องสมุดบุคคลที่สามโดยตรง


16

นี่คือความคิดเห็นส่วนใหญ่ที่ฉันคิด แต่ฉันจะใส่ 2p ของฉันอยู่ดี

วิธีที่ฉันได้ทำเสมอมันเป็นโดยการถามตัวเองว่าสิ่งที่จำนวนเงินขั้นต่ำของความรู้รหัสของฉันความต้องการที่จะมีการทำในสิ่งที่มันควรจะทำอย่างไร

หากรหัสของฉันใช้รหัสจาก Other team's libraryเท่านั้นฉันจะรวมOther team's libraryเป็นการอ้างอิงเท่านั้น

หากรหัสของฉันยังใช้โค้ดจากThird-party libraryนั้นเราก็จะรวมไว้เป็นอย่างดี

สมมติว่าผมมีชั้นเรียนต่อไปนี้จากMy Library, Other LibraryและThird-party Library(ฉันจะใช้ Java รหัสตัวอย่าง)

package mylibrary;

import otherlibrary.Bar;

public class Foo {

    public void doFoo() {
        Bar bar = new Bar();
        bar.doBar();
    }
}

ใน Other Library

package otherlibrary;

import thirdparty.Baz;

public class Bar {

    public void doBar() {
        Baz baz = new Baz();
        baz.doSomething();
    }
}

ใน Third-party library

package thirdparty;

public class Baz {

    public void doBaz() {
        System.out.println("baz");
    }
}

เนื่องจากรหัสของฉันFooขึ้นอยู่กับรหัสotherlibraryเท่านั้นนั่นคือทั้งหมดที่ฉันจะรวมไว้เพราะนั่นคือทั้งหมดที่ฉันสนใจ ฉันไม่สนใจว่าotherlibrary.Bar#doBarมันจะทำอย่างไรฉันแค่อยากให้มันทำ

อย่างไรก็ตามหากเราเปลี่ยนการotherlibrary.Bar#doBarยอมรับการBazทำบางสิ่งด้วยเช่น

public void doBar(Baz baz) {
    baz.doBaz();
}

ฉันจะต้องเปลี่ยนmylibrary.Foo#doFooเป็นบางอย่างเช่น

public void doFoo() {
    Bar bar = new Bar();
    Baz baz = new Baz();

    bar.doBar(baz);
}

เพราะตอนนี้ฉันสนใจที่Bar#doBarจะทำสิ่งนั้นและรหัสของฉันจำเป็นต้องรู้เกี่ยวกับBazการทำสิ่งที่ฉันต้องการให้ทำฉันต้องมีความชัดเจนเกี่ยวกับห้องสมุดที่ฉันใส่

หากรหัสของฉันต้องรู้เกี่ยวกับสิ่งต่าง ๆ ภายในthirdpartyห้องสมุดฉันจะต้องรวมมันเป็นสิ่งอ้างอิง

แม้ว่าผู้แต่งอาจBarจะซ่อนรายละเอียดเหล่านั้นไว้มากกว่านี้ดังนั้นฉันไม่จำเป็นต้องรวมthirdpartyไลบรารี ...


1
ฉันทั้งหมดนี้ แต่นรกเป็นปัญหาเสมอตัวอย่างเช่นถ้าฉันเริ่มต้นด้วยthirdypartyรุ่น 4 และotherlibraryต้องการรุ่น 3 คุณทำอะไรเกี่ยวกับเรื่องนี้?
Thiago Arrais
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.