Là tốt hơn để dựa vào phụ thuộc bắc cầu hoặc tuyên bố rõ ràng chúng?


11

Tôi có một cấu trúc dự án như thế này:

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

My Projectyêu cầu Other Team's Projectchức năng, và cả hai My ProjectOther Team's Projectyêu cầu Third Party Dependencychức năng. Chúng tôi đang sử dụng một hệ thống quản lý phụ thuộc để quản lý chúng.

Từ quan điểm thiết kế, tốt hơn là nên My Projectdựa vào quá cảnh Third Party Dependency? Hoặc là tốt hơn cho cả hai My ProjectOther Team's Projectcả hai tuyên bố rõ ràng rằng họ sử dụng Third Party Dependency?

Một vài điều khác:

  • Cả hai dự án cần phải có cùng một phiên bản Third Party Dependency.
  • Nó không được đảm bảo rằng nếu Other Team's Projectđược cập nhật My Projectsẽ được kiểm tra để đảm bảo rằng không có gì phá vỡ, bởi vì chúng được quản lý bởi các đội khác nhau.

Câu trả lời:


11

Hãy tưởng tượng điều gì xảy ra nếu nhóm khác tái cấu trúc dự án của họ để làm điều tương tự mà không sử dụng thư viện của bên thứ ba và họ loại bỏ sự phụ thuộc của họ. Hoặc họ chuyển sang thư viện bên thứ ba khác để làm điều tương tự. Mã của bạn vẫn hoạt động chứ?

Nếu nó làm mã của bạn chỉ phụ thuộc vào dự án khác, nếu không mã của bạn cũng phụ thuộc vào thư viện bên thứ ba.

Cả hai dự án cần phải có cùng một phiên bản Third Party Dependency.

Đó là một chỉ báo mạnh mẽ rằng dự án của bạn cũng phụ thuộc trực tiếp vào thư viện của bên thứ ba.


16

Điều này chủ yếu dựa trên quan điểm tôi nghĩ, nhưng dù sao tôi cũng sẽ đưa vào 2p của mình.

Cách mà tôi luôn làm là bằng cách tự hỏi bản thân mình, lượng kiến ​​thức tối thiểu mà mã của tôi cần phải làm là phải làm gì?

Nếu mã của tôi chỉ sử dụng mã từ Other team's library, thì tôi sẽ chỉ bao gồm Other team's librarynhư một phụ thuộc.

Nếu mã của tôi cũng sử dụng mã từ Third-party library, thì tôi cũng sẽ bao gồm nó.

Hãy nói rằng tôi đã có các lớp học sau đây từ My Library, Other LibraryThird-party Library(tôi sẽ sử dụng Java cho mã ví dụ)

package mylibrary;

import otherlibrary.Bar;

public class Foo {

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

bên trong Other Library

package otherlibrary;

import thirdparty.Baz;

public class Bar {

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

bên trong Third-party library

package thirdparty;

public class Baz {

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

Bởi vì mã của tôi Foochỉ phụ thuộc vào mã từ otherlibrary, đó là tất cả những gì tôi sẽ đưa vào, bởi vì đó là tất cả những gì tôi quan tâm. Tôi không quan tâm làm otherlibrary.Bar#doBarbất cứ điều gì nó làm, tôi chỉ muốn nó làm điều đó.

Tuy nhiên, nếu chúng tôi thay đổi otherlibrary.Bar#doBarđể chấp nhận Bazlàm một cái gì đó với, như

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

Sau đó tôi sẽ cần phải thay đổi mylibrary.Foo#doFoothành một cái gì đó như

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

    bar.doBar(baz);
}

Bởi vì bây giờ tôi quan tâm đến việc Bar#doBarsẽ thực hiện công việc của nó như thế nào và mã của tôi cần biết về Bazviệc thực hiện những gì tôi muốn nó làm, tôi cần phải rõ ràng về các thư viện tôi bao gồm.

Nếu mã của tôi phải biết về các thứ trong thirdpartythư viện, thì tôi phải bao gồm nó như một phần phụ thuộc.

Mặc dù có lẽ tác giả Barnên che giấu nhiều chi tiết hơn nên tôi không cần đưa thirdpartythư viện ...


1
Tôi là tất cả cho điều này. Nhưng địa ngục phụ thuộc luôn là một vấn đề nếu, ví dụ, tôi bắt đầu với thirdypartyphiên bản 4 và otherlibrarycần phiên bản 3. Bạn sẽ làm gì với nó?
Thiago Arrais
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.