2013-02-08 43 views
6

Tôi làm việc trên một sản phẩm khá lớn. Nó đã được phát triển kể từ .Net 1.0 vẫn là một công việc trong tiến trình và do đó nó có rất nhiều mã chất lượng kém và không được viết với các bài kiểm tra đơn vị trong tâm trí. Bây giờ chúng tôi đang cố gắng cải thiện chất lượng và thực hiện các kiểm tra cho từng tính năng và sửa lỗi. Một trong những vấn đề lớn nhất mà chúng ta đang gặp bây giờ là các đối tượng địa ngục và thần phụ thuộc. Có một đối tượng thần đặc biệt xấu: Session. Về cơ bản, bất cứ điều gì liên quan đến phiên hiện tại của chương trình là trong đối tượng này. Ngoài ra còn có một vài đối tượng thần khác.Giao diện kế thừa đối tượng chia tách thần?

Dù sao, chúng tôi đã làm đối tượng thần này "có thể chế nhạo" bằng cách sử dụng Resharper để trích xuất một giao diện ra khỏi chúng. Tuy nhiên, điều này vẫn gây khó khăn cho việc kiểm tra vì hầu hết thời gian bạn phải nhìn vào mã mà bạn viết để tìm ra những gì thực sự cần được chế giễu trong 100 phương pháp và sự thích hợp khác nhau.

Chỉ cần tách lớp này là ra khỏi câu hỏi ngay bây giờ bởi vì có nghĩa là hàng trăm nếu không phải hàng ngàn tham chiếu đến lớp này.

Bởi vì tôi có một giao diện (và gần như tất cả mã đã được cấu trúc lại để sử dụng giao diện), mặc dù, tôi đã có một ý tưởng thú vị. Điều gì sẽ xảy ra nếu tôi thực hiện giao diện ISession được kế thừa từ các giao diện khác.

Ví dụ, nếu chúng ta có một cái gì đó như thế này:

interface IBar 
{ 
    string Baz{get;set;} 
} 

interface IFoo 
{ 
    string Biz{get;set;} 
} 

interface ISession: IFoo, IBar 
{ 
} 

Bằng cách này, mã hiện sử dụng ISession sẽ không cần phải được cập nhật, cũng không thực hiện thực tế phải được cập nhật. Nhưng, trong đoạn mã mới chúng ta viết và cấu trúc lại, chúng ta có thể sử dụng các giao diện IFoo hoặc IBar chi tiết hơn, nhưng đi qua trong một ISession.

Và cuối cùng, tôi thấy điều này như thể làm cho nó dễ dàng hơn để cuối cùng chia tay thực tế ISession và Session thần giao diện/đối tượng

Bây giờ cho bạn. Đây có phải là một cách tốt để thử nghiệm chống lại những đồ vật thần và cuối cùng phá vỡ chúng? Đây có phải là cách tiếp cận và/hoặc mẫu thiết kế được tài liệu không? Bạn đã bao giờ làm bất cứ điều gì như thế này chưa?

+3

+1: Điều đó nghe như một cách hợp lý để thực hiện tái cấu trúc từng bước. –

+0

Nếu bạn chưa kiểm tra nó, [Làm việc hiệu quả với Mã kế thừa] (http://amzn.com/B005OYHF0A) bởi Michael Feathers có thể chứng minh có giá trị. Nó chứa nhiều chiến lược để giúp bạn mang lại một dự án như thế này dưới sự kiểm tra. Nhiều người trong số họ là hiển nhiên, nhưng nhìn thấy chúng trong in ấn giúp bạn tự tin để vượt qua và làm điều đó. –

+1

@AnthonyPegram đó thực sự là cuốn sách tiếp theo trong danh sách của tôi để có được – Earlz

Trả lời

6

Từ quan điểm của tôi, đây là cách tiếp cận tốt và đúng. Sau đó, bạn có thể tiêm các cá thể dịch vụ cụ thể hơn là IFoo/IBar thay vì ISession, tôi sẽ nói đây là bước trung gian tốt trước khi tiếp tục tái cấu trúc để trích xuất các lớp từ lớp thượng đế sang nhiều dịch vụ cụ thể.

Một số ưu tôi thấy:

giai đoạn đầu tiên: trích giao diện

  • Một siêu (thần) kiểu lớp là trừu tượng bởi giao diện
  • Mã trở nên ít đi đôi kể từ dựa vào đơn chức năng giao diện có trách nhiệm (dịch vụ)
  • Bạn có nền tảng để di chuyển xa hơn và chia lớp thần thành nhiều dịch vụ mà không cần phải tái cấu trúc lại sicne mọi thứ đã dựa trên giao diện API

Thứ hai giai đoạn: chia một lớp thần vào nhiều dịch vụ nhỏ với giữ Single Responsibility principle nhớ

thứ ba giai đoạn: Structurize kiểm tra đơn vị hiện có để kiểm tra nhóm theo từng loại dịch vụ chứ không phải là tất cả cùng nhau xung quanh một lớp thần

Các vấn đề liên quan