2009-02-09 43 views
6

Tôi đã được giao nhiệm vụ duy trì và tái cấu trúc hệ thống Java kế thừa. Tôi hiện đang làm C# và .NET, mặc dù tôi đã quen với Java.Tìm hiểu hệ thống Java kế thừa

Hệ thống cũ sử dụng RMI, kiến ​​trúc máy khách/máy chủ và được thiết kế cho 1,4 JVM. Nó sử dụng cho giao diện người dùng (theo như tôi có thể nói), Swing và AWT.

Câu hỏi của tôi là: Cách tốt nhất để đi đến điều khoản với codebase mà tôi vừa được giao là gì? Tôi đang suy nghĩ sơ đồ của màn hình, xác định ranh giới giữa các cuộc gọi RMI, và các bài kiểm tra đơn vị viết (cho các bit có thể kiểm tra được).

Bạn làm gì trong tình huống khi bạn được chuyển một codebase không quen thuộc?

Cảm ơn!

-Jarrod

Trả lời

5

Điều đầu tiên tôi làm với bất kỳ mã mới Tôi thuận tay là nhìn vào các bài kiểm tra đơn vị hiện có. Viết bài kiểm tra mới thường là điều thứ hai.

+0

Không chắc chắn nếu đó là dự định nhưng tôi tìm thấy nó buồn cười rằng điều tiếp theo thường là viết các bài kiểm tra mới (không nói nhiều về các bài kiểm tra đơn vị hiện có, không? :) – Learning

+0

Tôi không có nghĩa là để disparage đồng nghiệp của tôi , nhưng tôi chưa thấy 100% các bài kiểm tra đơn vị hoàn chỉnh (ngay cả bài kiểm tra của riêng tôi cũng có thể được cải thiện). :) Ngoài ra, tôi thấy rằng các bài kiểm tra viết chỉ là một cách tốt hơn cho tôi để tìm hiểu hơn là đọc chúng. –

+0

ROTFL, tốt nhất :))))))) – IAdapter

0

Java 1.4 với RMI không phải là di sản, đó là thực tế mới theo một số tiêu chuẩn!

Đỗ bất cứ điều gì bạn có thể làm để làm quen với nơi mà mọi thứ được - kiểm tra đơn vị, truy tìm mã/cuộc gọi, làm việc lên một số sơ đồ UML vv

Thử bắt đầu với một phần nhỏ hơn của nó và truy tìm đường dẫn mã để làm quen với mọi thứ hoặc chỉ định cho mình một số bản sửa lỗi/cải tiến nhỏ yêu cầu xem qua mã.

+0

Java 1.4 là khá cũ theo tiêu chuẩn Java (7 năm kể từ khi phát hành). Sun tuyên bố "End of Service Life" (EOSL) cho 1,4 vào tháng 10 sau 2 năm trong quá trình chuyển đổi cuối đời. Java 5 đạt đến EOSL vào cuối năm nay (http://java.sun.com/products/archive/eol.policy.html). –

+0

Trong mọi trường hợp, thuật ngữ di sản ở đây đơn giản có nghĩa là công ty của ông không còn sử dụng hệ thống hoặc không còn sử dụng các nhà phát triển ban đầu nữa, vì vậy mã là "cũ" bất kể cảm xúc của cộng đồng trên Java 1.4 – Karl

+0

Phải, "thực tế mới" chủ yếu là lưỡi-trong-má, nhưng Java 5 gần EOL của nó không có nghĩa là 1,4 không phải là vẫn phổ biến. Bất kể, Karl đúng về ý nghĩa thực sự của thuật ngữ "di sản". –

4

Phụ thuộc rất nhiều vào chất lượng của bộ mã. Trên thực tế, bạn có thể xác định nó thậm chí còn hẹp hơn - nó phụ thuộc vào cách mã rõ ràng, và nhận xét tốt như thế nào (và tôi viết nó như một người liên tục ở vị trí kế thừa các mã kế thừa cũ được ghi lại tài liệu kém).

Các codebase càng tồi tệ, bạn càng cần suy ra chức năng của nó từ bên ngoài - nếu bạn không thể biết được chức năng đang làm gì, ít nhất bạn có thể tìm ra GUI dường như ngụ ý rằng nó đang làm. Có một giao diện RMI có thể là một phước lành ở chỗ nó cung cấp cho bạn một bức tranh đơn giản về những gì GUI cần xem - trừu tượng từ giao diện từ xa là một ý tưởng rất hay.

Nếu bộ kiểm tra đơn vị thực sự không đủ khả năng giúp bạn, vì bạn có thể đang kiểm tra điều gì đó không đúng ngay cả khi được triển khai đúng cách. Một ví dụ từ điều cuối cùng tôi được thừa hưởng: (tên và mô tả loại bỏ cố ý - họ không phải là hữu ích trong bản gốc trong mọi trường hợp)

public static int[] a (List<int[]> input){ 

    ... lots of opaque rubbish 
    return b(input); 
} 

public static List<int[]> b{ List<int[]> input) 
{ 
    ... more crap.... 
    return some horribly mangled list of int[]; 
} 

Khi nó bật ra, những gì một thực hiện là để sắp xếp mảng bằng giá trị của phần tử thứ hai của chúng. Thử nghiệm b để hoạt động đúng cách sẽ vô ích trong trường hợp này.

Gợi ý để giúp bạn duy trì sự tỉnh táo của bạn:

  • đang loại bỏ đó là rõ ràng không sử dụng.
  • Cố gắng tìm ra bất kỳ "số ảo" nào
  • tìm bất kỳ tệp hardcode, đường dẫn hoặc tham chiếu tài nguyên nào và đưa chúng vào các thuộc tính hoặc bất kỳ cách nào khác chung chung để xử lý chúng.
  • cố gắng xác định xem ứng dụng có thực sự hoạt động theo cách mà nó không phải là bất thường đối với một số chức năng thực sự phức tạp mà bạn không thể làm cho đầu hoặc đuôi thực sự đại diện cho thứ gì đó mà người dùng cảm thấy ".
  • Tìm bất kỳ tài liệu gốc hoặc thông số kỹ thuật nào từ khi thiết kế được thiết kế lần đầu tiên.
  • Vì bạn đề cập đến 1.4, việc tổng quát hóa bản đồ có thể làm rõ loại đối tượng nào đang được chuyển. nếu bạn có một đối tượng được hỗ trợ bởi HashMap, và nó trở nên bí ẩn như thế nào, nó có thể thực sự đơn giản hóa cuộc sống của bạn để xác định rằng nó thực sự là Bản đồ các chuỗi thành số nguyên - thường dễ dàng hơn nhiều so với những gì nó thực sự được cho là để làm.

Tất nhiên phần lớn điều này là không cần thiết nếu codebase được viết tốt, nhưng sau đó công việc của bạn sẽ dễ dàng hơn nhiều trong mọi trường hợp. Và chúc may mắn.

1

Điều đầu tiên tôi làm khi nhận mã mới là "cố gắng làm cho mã hoạt động"! Bằng cách này, tôi muốn nói:

  • đầu tiên cài đặt nó (theo cài đặt ghi chú nếu có)

  • sau đó đọc bản thân mình với nó (bằng cách đọc các hướng dẫn sử dụng và chạy một số trường hợp sử dụng quan trọng)

  • sau đó một số kỹ thuật đảo ngược để tìm ra các lớp chính. lớp học và phụ thuộc

  • sau đó tôi có thể nghĩ về cách viết các trường hợp thử nghiệm mới (ở mức độ chấp nhận đầu tiên, điều đó sẽ có ích cho kiểm tra hồi quy sau này)

  • sau đó tôi cung cấp cho bản thân mình một số "thách thức" về việc thêm tính năng này (ngay cả khi không bắt buộc) hoặc cải thiện hiệu suất của tính năng hiện tại đó: đó là cách tốt để tìm hiểu về mã hiện tại

  • tất nhiên, nếu có một số lỗi đang chờ xử lý/RFE, tôi sẽ làm việc những cái đầu tiên

Trong trường hợp cụ thể của bạn, tôi cũng sẽ cố gắng ghi lại các cuộc gọi RMI, cuộc gọi hoặc chuỗi cuộc gọi để thực hiện những gì và liên kết nó với các tính năng mức sử dụng khi có thể.

Ngoài ra (và điều đó nên đến trước tiên), một điều quan trọng cần biết là mục tiêu chính của hệ thống này (tại sao khách hàng của bạn có hệ thống này?). Việc biết các mục tiêu và giữ chúng trong tâm trí sẽ tránh bạn tách rời khỏi các mục tiêu này trong khi duy trì mã.

0

Xây dựng và chạy nó sẽ là điều đầu tiên của tôi. Bắt đầu nhận được một cảm giác cho vấn đề nó đã cố gắng để giải quyết.

Có thể bạn có thể nhập nó vào một công cụ UML như JUDE và nhận được hình ảnh về cách các lớp tương tác.

Viết các kiểm tra JUnit là một gợi ý tuyệt vời. Tôi muốn xem cách ứng dụng xếp lớp. Nếu thật khó để kiểm tra, có lẽ nó quá giống nhau. Bài kiểm tra đơn vị sẽ cho bạn biết điều đó. Họ cũng sẽ cung cấp cho bạn một mạng lưới an toàn nếu bạn quyết định một số refactoring là theo thứ tự.

JDK 1.4? Nó đã kết thúc cuộc đời hỗ trợ của nó. Tôi cũng muốn xem liệu mã có thể xây dựng và chạy dưới JDK 5 ở mức tối thiểu hay không, tốt hơn là JDK 6. Có lẽ bạn có thể tát một vài trong số các kiểm tra JUnit đó vào JMeter và thực hiện kiểm tra tải của người nghèo nhanh với 5 người dùng đồng thời.

Nếu bạn đã có mô hình dữ liệu, hãy kéo mô hình đó vào ERWin và bắt đầu xem các bảng, đối tượng và màn hình kết hợp với nhau như thế nào.

2

Một điều giúp tôi làm việc với mã mới đối với tôi - điều này ít cần thiết hơn đối với mã được viết tốt - là tái cấu trúc lại nó trong một hoặc hai ngày và sau đó loại bỏ tất cả thay đổi của tôi. Quá trình này giúp tôi hiểu được mã nào; làm việc với mã giúp tôi hiểu nó. Nó cũng bắt đầu dạy tôi những phần nào của đoạn mã là mong manh.

Nếu bạn có cơ hội di chuyển sang bản phát hành Java mới hơn, thì việc tổng quát hóa tất cả các bộ sưu tập sẽ giúp hiểu loại dữ liệu nào được truyền đi.

Tất nhiên, tôi làm điều này sau khi cài đặt phần mềm trong phòng thí nghiệm thử nghiệm và chơi với nó một chút để hiểu những gì nó làm.

Chỉnh sửa: Suy nghĩ về câu trả lời của tôi, cũng hữu ích là cho phép tất cả dò tìm và ghi nhật ký chẩn đoán, sử dụng hệ thống và sau đó nghiên cứu nhật ký. Nếu truy tìm giao thức truyền thông tồn tại, thì nhìn vào dấu vết này sẽ giúp hiểu giao thức truyền thông được sử dụng bởi mã, có lẽ với một dấu vết Wireshark của cùng một thử nghiệm.

Di chuyển hữu ích khác là di chuyển từ thư viện Đồng thời cũ sang thư viện đồng thời Java 5 (và 6) mới. Điều này sẽ giúp bạn hiểu được chủ đề ở đâu và khi nào chúng được bắt đầu và khi nào chúng sẽ tắt.

Tất nhiên, với bất kỳ thay đổi mã nào trên cơ sở mã không quen thuộc, tôi cho rằng việc kiểm tra thích hợp được thực hiện để đảm bảo không có gì bị hỏng! Tuy nhiên, để cân bằng điều này, tôi đã học được rằng sau khi tái cấu trúc mã được viết sai, các lỗi mới được giới thiệu thường dễ tìm hơn các lỗi tồn tại trước khi tái cấu trúc.

0

Tất nhiên bạn có thể thử bước qua. Nó chậm nhưng một ngày dành cho việc đi bộ qua mã có thể tiết kiệm một tuần tìm kiếm lỗi sau này ...

Bạn cũng có thể thử cách tiếp cận tìm người nhặt rác, lập danh sách mọi tính năng và đi săn mã cho nó ...

0

Đầu tiên lướt qua mã để hiểu cấu trúc của nó. Sau đó, chạy ứng dụng trong chế độ gỡ lỗi và chạy qua nó một vài lần. Điều này sẽ cho bạn thấy dòng chảy và cấu trúc.

Sử dụng Netbeans để đảo ngược sơ đồ lớp kỹ sư.

1

Có một cuộc trò chuyện mà tôi đã tham dự của Mike Hill, trong đó anh ấy đã nói về một quá trình anh ấy sử dụng để xử lý mã di sản xấu. Ông gọi nó là "microtesting" và về cơ bản nó tách biệt từng điều bạn muốn thử nghiệm (trong chức năng riêng của nó hoặc đối tượng nhỏ), và viết các bài kiểm tra xung quanh nó. Những thử nghiệm này không có nghĩa là khẳng định mọi thứ theo nghĩa kinh doanh - chúng chỉ có nghĩa là nắm bắt trạng thái hệ thống còn lại sau khi các dòng được kiểm tra được thực hiện. Thông thường, anh ta sẽ khẳng định rằng các biến có giá trị mà chúng có trong trình gỡ rối. Đương nhiên, những thử nghiệm này sẽ vượt qua ban đầu, nhưng sau khi anh ta đã viết đủ cho họ, anh ta sẽ có một bản chụp hệ thống một cách hiệu quả.

Sau khi các thử nghiệm đó được thực hiện, anh ta có thể bắt đầu tái cấu trúc mã bit đó để cố gắng hiểu được những gì nó đang cố gắng thực hiện. Anh ta có thể làm như vậy một cách an toàn bởi vì "microtests" của anh ta sẽ thất bại nếu anh ta thay đổi cách chức năng (hoặc đối tượng) cư xử thậm chí một chút.Trong khi điều đó có nghĩa là anh không thể thay đổi thiết kế lớn, anh có thể loại bỏ rất nhiều tiếng ồn và anh có thể có được một bức tranh về những gì hệ thống đang làm. Khi anh ta có ý tưởng rõ ràng về những gì mã đã đạt được, anh ta có thể bắt đầu cải thiện nó, tìm lỗi, v.v.

Không có nhiều tài nguyên miễn phí về điều này, đó là lý do tại sao tôi không cung cấp liên kết. Hy vọng rằng tôi đã cố gắng mô tả đủ để cung cấp cho bạn một số ý tưởng.

1

Kinh nghiệm cho tôi thấy rằng có 3 mục tiêu chính bạn có khi học một hệ thống cũ.

  • Tìm hiểu những gì đang phải làm
  • Tìm hiểu cách nó làm chúng
  • (điều quan trọng) Tìm hiểu lý do tại sao nó làm cho họ con đường nó

Cả ba những phần rất quan trọng và có một vài thủ thuật để giúp bạn bắt đầu.

Trước tiên, hãy chống lại sự cám dỗ khi chỉ cần nhấn ctrl (hoặc bất kỳ IDE nào của bạn sử dụng) theo cách của bạn xung quanh mã để hiểu mọi thứ. Bạn có thể sẽ không thể giữ mọi thứ theo quan điểm trong tâm trí bạn theo cách này, đặc biệt là khi mỗi dòng buộc bạn phải nhìn vào nhiều lớp khác để hiểu nó là gì.

Đọc tài liệu khi có thể; nó thường giúp bạn nhanh chóng đạt được một khuôn khổ tinh thần để xây dựng mọi thứ sau đó.

Chạy các trường hợp kiểm tra nếu có thể.

Đừng ngại hỏi ai đó biết nếu bạn có câu hỏi. Cấp, bạn không nên lãng phí thời gian của nhân viên khác với các truy vấn không rõ ràng, nhưng nếu có điều gì đó mà bạn không hiểu (điều này đặc biệt đúng với các câu hỏi mang tính khái niệm như, "Sẽ không có ý nghĩa hơn khi thực hiện điều này một ___ "hoặc một cái gì đó), nó có thể là giá trị tìm ra câu trả lời trước khi bạn mess một cái gì đó lên và không biết tại sao.

Khi bạn cuối cùng cũng đọc được mã, hãy bắt đầu từ một vị trí "chính" hợp lý và đi từ đó. Không chỉ đọc mã trên xuống dưới, hoặc theo thứ tự bảng chữ cái, hoặc bất cứ thứ gì (điều này có lẽ là hiển nhiên).

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