Có gì sai với tài liệu tham khảo thông tư?


160

Tôi đã tham gia vào một cuộc thảo luận lập trình ngày hôm nay khi tôi đưa ra một số tuyên bố về cơ bản giả định rằng các tham chiếu vòng tròn (giữa các mô-đun, các lớp, bất cứ điều gì) nói chung là xấu. Khi tôi đã vượt qua được bình luận của mình, đồng nghiệp của tôi đã hỏi, "có gì sai với các tham chiếu vòng tròn?"

Tôi đã có cảm xúc mạnh mẽ về điều này, nhưng thật khó để tôi có thể diễn đạt bằng lời ngắn gọn và cụ thể. Bất kỳ lời giải thích nào mà tôi có thể đưa ra có xu hướng dựa vào các mục khác mà tôi cũng xem xét các tiên đề ("không thể sử dụng một cách cô lập, vì vậy không thể kiểm tra", "hành vi không xác định / không xác định là trạng thái đột biến trong các đối tượng tham gia", v.v. .), nhưng tôi rất muốn nghe một lý do ngắn gọn về lý do tại sao các tài liệu tham khảo vòng tròn là xấu mà không có những bước nhảy vọt mà bộ não của tôi làm, đã dành nhiều giờ trong nhiều năm để gỡ rối cho họ để hiểu, sửa chữa, và mở rộng các bit khác nhau của mã.

Chỉnh sửa: Tôi không hỏi về các tham chiếu vòng tròn đồng nhất, như các tham chiếu trong danh sách liên kết đôi hoặc con trỏ tới cha mẹ. Câu hỏi này thực sự hỏi về các tham chiếu vòng tròn "phạm vi lớn hơn", như libA gọi libB gọi lại libA. Thay thế 'mô-đun' cho 'lib' nếu bạn muốn. Cảm ơn tất cả các câu trả lời cho đến nay!


Có tham chiếu tròn liên quan đến thư viện và các tập tin tiêu đề? Trong quy trình làm việc, mã ProjectB mới sẽ xử lý một tệp xuất ra từ mã ProjectA cũ. Đầu ra đó từ ProjectA là một yêu cầu mới được điều khiển bởi ProjectB; ProjectB có một mã tạo điều kiện thuận lợi cho việc xác định chung các trường đi đâu, v.v. Điểm chính, ProjectA kế thừa có thể sử dụng lại mã trong ProjectB mới và ProjectB sẽ thật ngu ngốc khi không sử dụng lại mã tiện ích trong ProjectA (ví dụ: phát hiện và chuyển mã ký tự, phân tích bản ghi, xác thực và chuyển đổi dữ liệu, v.v.).
Luv2code

1
@ Luv2code Nó chỉ trở nên ngu ngốc nếu bạn cắt và dán mã giữa các dự án hoặc có thể khi cả hai dự án biên dịch và liên kết trong cùng một mã. Nếu họ đang chia sẻ tài nguyên như thế này, hãy đặt chúng vào thư viện.
dash-tom-bang

Câu trả lời:


220

Có rất nhiều điều sai với các tham chiếu vòng tròn:

  • Tài liệu tham khảo lớp tròn tạo ra khớp nối cao ; cả lớp phải được biên dịch lại mỗi khi một trong hai trong số họ được thay đổi.

  • Tham chiếu lắp ráp tròn ngăn chặn liên kết tĩnh , vì B phụ thuộc vào A nhưng A không thể được lắp ráp cho đến khi B hoàn thành.

  • Tham chiếu đối tượng tròn có thể phá vỡ các thuật toán đệ quy ngây thơ (chẳng hạn như tuần tự hóa, khách truy cập và máy in đẹp) với tràn ngăn xếp. Các thuật toán tiên tiến hơn sẽ có phát hiện chu kỳ và sẽ chỉ thất bại với thông báo ngoại lệ / lỗi mô tả nhiều hơn.

  • Tham chiếu đối tượng tròn cũng làm cho việc tiêm phụ thuộc là không thể , làm giảm đáng kể khả năng kiểm tra hệ thống của bạn.

  • Các đối tượng có số lượng tham chiếu vòng tròn rất lớn thường là Đối tượng của Chúa . Ngay cả khi họ không, họ có xu hướng dẫn đến Spaghetti Code .

  • Tham chiếu thực thể tròn (đặc biệt là trong cơ sở dữ liệu, mà cả trong các mô hình miền) ngăn chặn việc sử dụng các ràng buộc không có giá trị, cuối cùng có thể dẫn đến tham nhũng dữ liệu hoặc ít nhất là không nhất quán.

  • Các tài liệu tham khảo thông thường nói chung đơn giản là gây nhầm lẫn và làm tăng đáng kể tải nhận thức khi cố gắng hiểu cách thức hoạt động của một chương trình.

Xin hãy nghĩ về những đứa trẻ; tránh tham chiếu vòng tròn bất cứ khi nào bạn có thể.


32
Tôi đặc biệt đánh giá cao điểm cuối cùng, "tải nhận thức" là điều mà tôi rất ý thức nhưng chưa bao giờ có một thuật ngữ ngắn gọn tuyệt vời cho nó.
dash-tom-bang

6
Câu trả lời tốt. Sẽ tốt hơn nếu bạn nói điều gì đó về thử nghiệm. Nếu các mô-đun A và B phụ thuộc lẫn nhau, chúng phải được kiểm tra cùng nhau. Điều này có nghĩa là chúng không thực sự là các mô-đun riêng biệt; cùng nhau họ là một mô-đun bị hỏng.
kevin cline

5
Việc tiêm phụ thuộc không phải là không thể với các tham chiếu vòng tròn, ngay cả với DI tự động. Một người sẽ chỉ cần được tiêm một thuộc tính chứ không phải là một tham số hàm tạo.
BlueRaja - Daniel Pflughoeft

3
@ BlueRaja-DannyPflughoeft: Tôi cho rằng đó là một kiểu chống đối, cũng như nhiều học viên khác của DI, bởi vì (a) không rõ ràng rằng một tài sản thực sự là một sự phụ thuộc và (b) đối tượng bị "tiêm" không thể dễ dàng theo dõi các bất biến của chính nó. Tồi tệ hơn, nhiều khung công tác phức tạp / phổ biến nhất như Castle Windsor không thể đưa ra các thông báo lỗi hữu ích nếu không thể giải quyết được sự phụ thuộc; bạn kết thúc với một tham chiếu null khó chịu thay vì một lời giải thích chi tiết về chính xác sự phụ thuộc mà nhà xây dựng không thể giải quyết được. Chỉ vì bạn có thể , không có nghĩa là bạn nên .
Aaronaught

3
Tôi đã không tuyên bố đó là một thực hành tốt, tôi chỉ chỉ ra rằng nó không phải là không thể như đã tuyên bố trong câu trả lời.
BlueRaja - Daniel Pflughoeft

22

Một tham chiếu tròn là hai lần khớp nối của một tham chiếu không tròn.

Nếu Foo biết về Bar và Bar biết về Foo, bạn có hai điều cần thay đổi (khi yêu cầu là Foos và Bars không còn biết về nhau nữa). Nếu Foo biết về Bar, nhưng một Bar không biết về Foo, bạn có thể thay đổi Foo mà không cần chạm vào Bar.

Tham chiếu theo chu kỳ cũng có thể gây ra sự cố bootstrapping, ít nhất là trong các môi trường tồn tại trong một thời gian dài (dịch vụ được triển khai, môi trường phát triển dựa trên hình ảnh), trong đó Foo phụ thuộc vào Bar hoạt động để tải, nhưng Bar cũng phụ thuộc vào Foo hoạt động để tải trọng.


17

Khi bạn buộc hai bit mã lại với nhau, bạn thực sự có một đoạn mã lớn. Khó khăn trong việc duy trì một chút mã ít nhất là bình phương kích thước của nó, và có thể cao hơn.

Mọi người thường nhìn vào độ phức tạp của lớp đơn (/ hàm / tệp / v.v.) và quên rằng bạn thực sự nên xem xét độ phức tạp của đơn vị tách rời (đóng gói) nhỏ nhất. Có một phụ thuộc vòng tròn làm tăng kích thước của đơn vị đó, có thể là vô hình (cho đến khi bạn bắt đầu cố gắng thay đổi tệp 1 và nhận ra rằng cũng yêu cầu thay đổi trong tệp 2-127).


14

Chúng có thể xấu không phải bởi bản thân chúng mà là một chỉ báo về một thiết kế kém có thể. Nếu Foo phụ thuộc vào Bar và Bar phụ thuộc vào Foo, thì thật hợp lý khi đặt câu hỏi tại sao chúng là hai thay vì một FooBar độc đáo.


10

Hmm ... điều đó phụ thuộc vào ý của bạn bởi sự phụ thuộc vòng tròn, bởi vì thực sự có một số phụ thuộc vòng tròn mà tôi nghĩ là rất có lợi.

Hãy xem xét một DOM DOM - thật hợp lý khi mọi nút có một tham chiếu đến cha mẹ của chúng và cho mọi cha mẹ có một danh sách các con của nó. Cấu trúc là một cây logic, nhưng theo quan điểm của thuật toán thu gom rác hoặc tương tự cấu trúc là hình tròn.


1
đó sẽ không phải là một cái cây?
Conrad Frix

@Conrad: Tôi cho rằng nó có thể được coi là một cái cây, vâng. Tại sao?
Billy ONeal

1
Tôi không nghĩ cây là hình tròn vì bạn có thể điều hướng xuống con của nó và sẽ chấm dứt (bất kể tham chiếu của phụ huynh). Trừ khi một nút có một đứa trẻ cũng là tổ tiên mà trong tâm trí tôi làm cho nó thành một biểu đồ chứ không phải là một cái cây.
Conrad Frix

5
Một tham chiếu tròn sẽ là nếu một trong những đứa con của một nút được lặp lại với tổ tiên.
Matt Olenik

Đây thực sự không phải là một sự phụ thuộc vòng tròn (ít nhất là không phải theo cách gây ra bất kỳ vấn đề nào). Ví dụ, hãy tưởng tượng đó Nodelà một lớp học, có các tài liệu tham khảo khác Nodecho trẻ em bên trong chính nó. Bởi vì nó chỉ tham chiếu chính nó, lớp hoàn toàn khép kín và không được kết hợp với bất kỳ thứ gì khác. --- Với lập luận này, bạn có thể lập luận rằng hàm đệ quy là một phụ thuộc vòng tròn. Đó (ở một đoạn), nhưng không phải là một cách xấu.
byxor

9

Giống như vấn đề Gà hay Trứng .

Có nhiều trường hợp trong đó tham chiếu vòng tròn là không thể tránh khỏi và hữu ích, nhưng, ví dụ, trong trường hợp sau, nó không hoạt động:

Dự án A phụ thuộc vào dự án B và B phụ thuộc vào A. A cần được biên dịch để được sử dụng trong B yêu cầu B được biên dịch trước A yêu cầu B được biên dịch trước A mà ...


6

Mặc dù tôi đồng ý với hầu hết các ý kiến ​​ở đây, tôi muốn đưa ra một trường hợp đặc biệt cho tham chiếu vòng tròn "cha mẹ" / "con".

Một lớp thường cần biết điều gì đó về lớp cha hoặc lớp sở hữu của nó, có lẽ là hành vi mặc định, tên của tệp dữ liệu đến từ, câu lệnh sql đã chọn cột hoặc vị trí của tệp nhật ký, v.v.

Bạn có thể làm điều này mà không cần tham chiếu vòng tròn bằng cách có một lớp chứa để cái mà trước đây "cha mẹ" bây giờ là anh chị em, nhưng không phải lúc nào cũng có thể xác định lại mã hiện có để làm điều này.

Một cách khác là truyền tất cả dữ liệu mà một đứa trẻ có thể cần trong hàm tạo của nó, cuối cùng chỉ đơn giản là khủng khiếp.


Trong một lưu ý liên quan, có hai lý do phổ biến X có thể đề cập đến Y: X có thể muốn yêu cầu Y làm việc thay mặt X, hoặc Y có thể mong đợi X làm việc đó với Y, thay mặt Y. Nếu các tài liệu tham khảo duy nhất tồn tại cho Y là cho mục đích của các đối tượng khác muốn thực hiện thay mặt cho Y, thì chủ sở hữu của các tài liệu tham khảo đó nên được thông báo rằng các dịch vụ của Y không còn cần thiết nữa và họ nên từ bỏ các tài liệu tham khảo của họ cho Y tại thuận tiện của họ.
supercat

5

Trong thuật ngữ cơ sở dữ liệu, các tham chiếu vòng tròn với các mối quan hệ PK / FK thích hợp làm cho không thể chèn hoặc xóa dữ liệu. Nếu bạn không thể xóa khỏi bảng a trừ khi bản ghi bị xóa khỏi bảng b và bạn không thể xóa khỏi bảng b trừ khi bản ghi bị xóa khỏi bảng A, bạn không thể xóa. Tương tự với chèn. đây là lý do tại sao nhiều cơ sở dữ liệu không cho phép bạn thiết lập cập nhật xếp tầng hoặc xóa nếu có một tham chiếu vòng vì tại một số điểm, điều đó trở nên không thể. Có, bạn có thể thiết lập các loại mối quan hệ này với việc PK / Fk được tuyên bố chính thức nhưng sau đó bạn sẽ (100% thời gian theo kinh nghiệm của tôi) có vấn đề về tính toàn vẹn dữ liệu. Đó chỉ là thiết kế tồi.


4

Tôi sẽ đưa câu hỏi này từ quan điểm mô hình hóa.

Miễn là bạn không thêm bất kỳ mối quan hệ nào không thực sự ở đó, bạn sẽ an toàn. Nếu bạn thêm chúng, bạn sẽ nhận được ít tính toàn vẹn hơn trong dữ liệu (vì có sự dư thừa) và mã được liên kết chặt chẽ hơn.

Điều đặc biệt với các tham chiếu vòng tròn cụ thể là tôi chưa thấy trường hợp nào thực sự cần thiết ngoại trừ một tham chiếu tự. Nếu bạn mô hình cây hoặc đồ thị, bạn cần điều đó và nó hoàn toàn ổn vì tự tham chiếu là vô hại theo quan điểm chất lượng mã (không thêm phụ thuộc).

Tôi tin rằng tại thời điểm bạn bắt đầu cần một tài liệu tham khảo vô ngã, ngay lập tức bạn nên hỏi xem bạn có thể mô hình hóa nó dưới dạng biểu đồ không (thu gọn nhiều thực thể thành một nút). Có thể có một trường hợp ở giữa nơi bạn tạo một tham chiếu vòng tròn nhưng mô hình hóa nó dưới dạng biểu đồ là không phù hợp nhưng tôi rất nghi ngờ điều đó.

Có một mối nguy hiểm mà mọi người nghĩ rằng họ cần một tài liệu tham khảo vòng tròn nhưng thực tế họ không có. Trường hợp phổ biến nhất là "Vụ án có một không hai". Chẳng hạn, bạn đã có một khách hàng có nhiều địa chỉ mà từ đó một địa chỉ sẽ được đánh dấu là địa chỉ chính. Rất hấp dẫn khi mô hình hóa tình huống này là hai mối quan hệ riêng biệt has_addressis_primary_address_of nhưng điều đó không chính xác. Lý do là địa chỉ chính không phải là mối quan hệ riêng giữa người dùng và địa chỉ mà thay vào đó, nó là một thuộc tính của mối quan hệ có địa chỉ. Tại sao vậy? Bởi vì tên miền của nó bị giới hạn trong các địa chỉ của người dùng và không phải tất cả các địa chỉ đó. Bạn chọn một trong các liên kết và đánh dấu nó là mạnh nhất (chính).

(Sẽ nói về cơ sở dữ liệu ngay bây giờ) Nhiều người chọn giải pháp hai mối quan hệ vì họ hiểu "chính" là một con trỏ duy nhất và khóa ngoại là một loại con trỏ. Vì vậy, khóa ngoại nên là thứ để sử dụng, phải không? Sai lầm. Khóa ngoại đại diện cho các mối quan hệ nhưng "chính" không phải là mối quan hệ. Đây là một trường hợp suy biến của một đơn đặt hàng trong đó một yếu tố là trên hết và phần còn lại không được đặt hàng. Nếu bạn cần lập mô hình tổng thứ tự, tất nhiên bạn sẽ coi đó là thuộc tính của mối quan hệ vì về cơ bản không có lựa chọn nào khác. Nhưng tại thời điểm bạn thoái hóa nó, có một sự lựa chọn và khá kinh khủng - để mô hình hóa một thứ không phải là mối quan hệ như một mối quan hệ. Vì vậy, đây là - sự dư thừa mối quan hệ mà chắc chắn không phải là một cái gì đó để đánh giá thấp.

Vì vậy, tôi sẽ không cho phép một tham chiếu vòng tròn xảy ra trừ khi hoàn toàn rõ ràng rằng nó xuất phát từ thứ tôi đang làm người mẫu.

(lưu ý: điều này hơi thiên về thiết kế cơ sở dữ liệu nhưng tôi cá là nó cũng có thể áp dụng được cho các lĩnh vực khác)


2

Tôi sẽ trả lời câu hỏi đó bằng một câu hỏi khác:

Tình huống nào bạn có thể cho tôi khi giữ một mô hình tham chiếu tròn là mô hình tốt nhất cho những gì bạn đang cố gắng xây dựng?

Từ kinh nghiệm của tôi, mô hình tốt nhất sẽ không bao giờ liên quan đến các tham chiếu vòng tròn theo cách tôi nghĩ bạn muốn nói. Điều đó đang được nói, có rất nhiều mô hình mà bạn sử dụng tài liệu tham khảo vòng tròn mọi lúc, nó cực kỳ cơ bản. Cha mẹ -> Mối quan hệ con cái, bất kỳ mô hình đồ thị, v.v., nhưng đây là những mô hình nổi tiếng và tôi nghĩ bạn đang đề cập đến một cái gì đó hoàn toàn khác.


1
Có thể một danh sách liên kết vòng tròn (liên kết đơn hoặc liên kết đôi) sẽ là một cấu trúc dữ liệu tuyệt vời cho hàng đợi sự kiện trung tâm cho một chương trình được cho là "không bao giờ dừng lại" (dán N điều quan trọng trên hàng đợi, với một Đặt cờ "không xóa", sau đó chỉ cần duyệt qua hàng đợi cho đến khi trống, khi cần các tác vụ mới (tạm thời hoặc vĩnh viễn), hãy dán chúng vào một vị trí thích hợp trên hàng đợi; bất cứ khi nào bạn phục vụ ngay cả khi không có cờ "không xóa" , làm điều đó sau đó đưa nó ra khỏi hàng đợi).
Vatine

1

Tham chiếu tròn trong cấu trúc dữ liệu đôi khi là cách tự nhiên để thể hiện một mô hình dữ liệu. Mã hóa khôn ngoan, nó chắc chắn không lý tưởng và có thể (ở một mức độ nào đó) được giải quyết bằng cách tiêm phụ thuộc, đẩy vấn đề từ mã sang dữ liệu.


1

Cấu trúc tham chiếu vòng tròn có vấn đề, không chỉ từ quan điểm thiết kế, mà còn từ quan điểm bắt lỗi.

Xem xét khả năng của một lỗi mã. Bạn chưa đặt lỗi bắt đúng trong cả hai lớp, vì bạn chưa phát triển phương thức của mình cho đến nay hoặc bạn lười biếng. Dù bằng cách nào, bạn không có thông báo lỗi để cho bạn biết những gì đã xảy ra và bạn cần gỡ lỗi nó. Là một nhà thiết kế chương trình giỏi, bạn biết các phương thức nào có liên quan đến các quy trình, vì vậy bạn có thể thu hẹp nó thành các phương thức có liên quan đến quy trình gây ra lỗi.

Với các tham chiếu tròn, các vấn đề của bạn đã tăng gấp đôi. Bởi vì các quy trình của bạn bị ràng buộc chặt chẽ, bạn không có cách nào biết được phương thức nào trong đó lớp nào có thể gây ra lỗi, hoặc từ đó xảy ra lỗi, bởi vì một lớp phụ thuộc vào lớp kia phụ thuộc vào lớp kia. Bây giờ bạn phải dành thời gian kiểm tra cả hai lớp kết hợp để tìm ra cái nào thực sự chịu trách nhiệm cho lỗi.

Tất nhiên, việc bắt lỗi thích hợp sẽ giải quyết vấn đề này, nhưng chỉ khi bạn biết khi nào có khả năng xảy ra lỗi. Và nếu bạn đang sử dụng thông báo lỗi chung, bạn vẫn không khá hơn nhiều.


1

Một số người thu gom rác gặp khó khăn trong việc dọn dẹp chúng, bởi vì mỗi đối tượng đang được người khác tham chiếu.

EDIT: Như đã lưu ý bởi các bình luận bên dưới, điều này chỉ đúng với một nỗ lực cực kỳ ngây thơ tại một công cụ thu gom rác, không phải là một điều mà bạn sẽ gặp trong thực tế.


11
Hmm .. bất kỳ người thu gom rác nào bị vấp ngã bởi đây không phải là người thu gom rác thực sự.
Billy ONeal

11
Tôi không biết bất kỳ công cụ thu gom rác hiện đại nào có vấn đề với các tham chiếu vòng tròn. Tham chiếu tròn là một vấn đề nếu bạn đang sử dụng số tham chiếu, nhưng hầu hết người thu gom rác đều theo dõi kiểu (nơi bạn bắt đầu với danh sách các tài liệu tham khảo đã biết và theo dõi họ để tìm tất cả những người khác, thu thập mọi thứ khác).
Dean Harding

4
Xem sct.ethz . , bạn bắt đầu gặp vấn đề với các cấu trúc hình tròn (khi các đối tượng hình tròn ở các thế hệ khác nhau). Nếu bạn lấy số tham chiếu và bắt đầu khắc phục sự cố tham chiếu vòng tròn, cuối cùng bạn sẽ giới thiệu thời gian tạm dừng dài là đặc trưng của đánh dấu và quét.
Ken Bloom

Nếu một người thu gom rác nhìn vào Foo và giải phóng bộ nhớ của nó, trong ví dụ này tham chiếu Bar, nó sẽ xử lý loại bỏ Bar. Do đó, tại thời điểm này, không cần người thu gom rác đi trước và gỡ bỏ thanh vì nó đã làm. Hoặc ngược lại, nếu nó loại bỏ Bar tham chiếu Foo thì nó cũng sẽ loại bỏ Foo và do đó nó sẽ không cần phải xóa Foo vì nó đã làm như vậy khi xóa Bar? Xin hãy sửa tôi nếu tôi sai.
Chris

1
Trong object-c, các tham chiếu vòng tròn làm cho nó để số lượng ref không đạt đến 0 khi bạn giải phóng, làm tăng bộ thu gom rác.
DexterW

-2

Theo tôi, việc có các tài liệu tham khảo không hạn chế giúp thiết kế chương trình dễ dàng hơn, nhưng tất cả chúng ta đều biết rằng một số ngôn ngữ lập trình thiếu hỗ trợ cho chúng trong một số ngữ cảnh.

Bạn đã đề cập đến các tài liệu tham khảo giữa các mô-đun hoặc các lớp. Trong trường hợp đó, đó là một điều tĩnh, được lập trình viên xác định trước và rõ ràng là lập trình viên có thể tìm kiếm một cấu trúc thiếu tính tuần hoàn, mặc dù nó có thể không phù hợp với vấn đề một cách sạch sẽ.

Vấn đề thực sự xuất hiện ở tính tuần hoàn trong cấu trúc dữ liệu thời gian chạy, trong đó một số vấn đề thực sự không thể được xác định theo cách loại bỏ tính tuần hoàn. Cuối cùng, mặc dù - đó là vấn đề nên ra lệnh và yêu cầu bất cứ điều gì khác là buộc lập trình viên phải giải một câu đố không cần thiết.

Tôi muốn nói rằng đó là một vấn đề với các công cụ không phải là một vấn đề với nguyên tắc.


Thêm một ý kiến ​​một câu không đóng góp đáng kể vào bài viết hoặc giải thích câu trả lời. Bạn có thể giải thích về điều này?

Vâng, hai điểm, người đăng thực sự đề cập đến các tham chiếu giữa các mô-đun hoặc các lớp. Trong trường hợp đó, đó là một điều tĩnh, được lập trình viên xác định trước và rõ ràng là lập trình viên có thể tìm kiếm một cấu trúc thiếu tính tuần hoàn, mặc dù nó có thể không phù hợp với vấn đề một cách sạch sẽ. Vấn đề thực sự xuất hiện ở tính tuần hoàn trong cấu trúc dữ liệu thời gian chạy, trong đó một số vấn đề thực sự không thể được xác định theo cách loại bỏ tính tuần hoàn. Cuối cùng, mặc dù - đó là vấn đề nên ra lệnh và yêu cầu bất cứ điều gì khác là buộc lập trình viên phải giải một câu đố không cần thiết.
Josh S

Tôi đã thấy rằng việc cài đặt và chạy chương trình của bạn dễ dàng hơn nhưng nói chung, điều đó cuối cùng làm cho việc bảo trì phần mềm trở nên khó khăn hơn vì bạn thấy rằng những thay đổi nhỏ có tác động xếp tầng. A thực hiện các cuộc gọi vào B khiến các cuộc gọi trở lại A khiến các cuộc gọi trở lại B ... Tôi thấy thật khó để hiểu được tác động của những thay đổi của bản chất này, đặc biệt là khi A và B là đa hình.
dash-tom-bang
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.