Tái cấu trúc: Không phải nó chỉ là một từ ưa thích để làm sạch mã của bạn sao? [đóng cửa]


21

Trước khi cuốn sách "Tái cấu trúc: Cải thiện thiết kế mã hiện tại" của Martin Fowler ra mắt, chúng tôi thường gọi những thay đổi lớn là mã "rearch architecture" và những thay đổi nhỏ là "dọn dẹp". IMO, kỹ thuật tái cấu trúc là tất cả những điều thông thường / những điều hiển nhiên mà chúng tôi đã làm mãi mãi.

Bạn có nghĩ tái cấu trúc là bất cứ điều gì mới? Có lẽ chỉ là một cách để lừa quản lý phân bổ thời gian để dọn mã?


Khi bạn nói "trước khi cuốn sách ra mắt", tôi cho rằng bạn đang đề cập đến cuốn sách của Martin Folweller có đúng không?
AlexC

-1: Tính hữu ích của câu hỏi này là gì?
Jim G.

Có cuốn sách của Fowler.
Chuck Stephanski

Câu trả lời:


43

Tái cấu trúc cũ hơn các ngọn đồi, vì vậy không, nó không có gì mới.

Và tái cấu trúc không làm sạch. Vâng, nó có thể, nhưng nó không giới hạn trong việc dọn dẹp.

Đó là điều chỉnh kiến ​​trúc ứng dụng của bạn (dù ở quy mô lớn hay nhỏ) trong khi duy trì hành vi.

Điều đó có nghĩa là trong khi một số phần trong ứng dụng của bạn có thể đã hoàn toàn sạch và tốt vào ngày hôm qua, thì tính năng mới hôm nay yêu cầu điều chỉnh phần đó để phù hợp với tính năng mới.

Bạn không muốn phá vỡ chức năng hiện có, vì vậy bạn điều chỉnh cấu trúc ứng dụng của mình trong khi duy trì hành vi - đó là tái cấu trúc.

Điều này cho biết bất kể thay đổi nào được thực hiện đối với mã, người ta luôn phải chạy thử nghiệm của mình ... chỉ trong trường hợp.


1
Newtopian: đó là một điểm quan trọng. Nếu bạn không chạy thử nghiệm, bạn sẽ không biết liệu mình đã hack ngẫu nhiên thứ gì đó hay thực sự được tái cấu trúc . (Và tất nhiên, bạn cần một bộ kiểm tra đầy đủ!)
Frank Shearar

9

Nó chỉ là dọn dẹp mã lên. Về cơ bản, các lập trình viên (đặc biệt là Martin Fowler) nhận thấy rằng họ có xu hướng thực hiện các nhiệm vụ tương tự mỗi khi họ dọn dẹp mã của họ. Họ đã định nghĩa và dán nhãn cho các phương pháp dọn dẹp và các vấn đề về mã liên quan và uy tín! Tái cấu trúc đã ra đời.

Điều này giống với các mẫu thiết kế - mọi người nhận thấy rằng họ có xu hướng sử dụng các phương pháp tương tự cho các vấn đề cụ thể lặp đi lặp lại. Họ đã gắn nhãn và định nghĩa các cách tiếp cận và bây giờ có vẻ như bạn không phải là một lập trình viên thực sự trừ khi bạn chỉ sử dụng cùng một tá các mẫu trong mã của mình.

Không có phép thuật để tái cấu trúc; nó chỉ là một bộ biệt ngữ mới để mô tả một thực hành cũ.


William Opdyke, 1992: Tái cấu trúc các khung hướng đối tượng . Fowler & Beck và bạn bè tái cấu trúc phổ biến . Jon Brant và Don Roberts đã triển khai công cụ tự động đầu tiên một thời gian trước năm 1999. Vì vậy, "bộ biệt ngữ mới" không chính xác lắm.
Frank Shearar

Nếu bạn chấp nhận rằng lập trình máy tính đã diễn ra kể từ Ada Lovelace vào giữa những năm 1800, thì có - đó là một bộ biệt ngữ tương đối mới.
Ant

1
Tôi nghĩ rằng sự khác biệt là với các Mẫu thiết kế hầu hết mọi nhà phát triển đã học một số mẫu mới và do đó một số công cụ mới của giao dịch từ cuốn sách. Với Tái cấu trúc, tôi không cảm thấy như bất kỳ ai thực sự học được gì. Có giá trị thứ cấp khi chỉ đặt tên cho một cái gì đó (và so sánh các mẫu thiết kế giữ ở đó) nhưng anh ta có thể đã làm điều đó với một bài đăng trên blog.
Chuck Stephanski

Thật vậy, tôi đã đề cập rằng đó là biệt ngữ mới ... liên quan đến phép tính lambda.
Frank Shearar

@Chuck, bạn đã đọc cuốn sách, Tái cấu trúc chưa? Nếu vậy, tôi sẽ rất ngạc nhiên nếu bạn không học được điều gì mới từ nó.
Marcie

7

Chúng tôi làm ba việc riêng biệt trong công ty, với thời gian dành cho ba người:

  • Tái cấu trúc: bao gồm thay đổi cấu trúc mã, do đó giữ hành vi.

Ví dụ: tách một phương thức 100 dòng xấu xí và không thể đọc được, thực hiện bốn điều thành bốn phương thức có thể sử dụng lại, mỗi phương thức 25 dòng.

  • Dọn dẹp: bao gồm thực hiện các sửa đổi nhỏ để làm cho mã dễ đọc hơn mà không sửa đổi hành vi cũng như cấu trúc của nó.

Ví dụ: xóa mã nhận xét sau khi đảm bảo rằng mã này không còn cần thiết nữa.

  • Thực thi các quy tắc StyleCop / FxCop: bao gồm kiểm tra xem mã có khớp với bộ quy tắc StyleCop hoặc FxCop mặc định hay không và nếu không, hãy sửa đổi nó để phù hợp với các quy tắc đó.

Ví dụ: thêm Culture.Invariantvào string.Format(hoặc văn hóa khác phù hợp hơn).

Vì vậy, trong trường hợp của tôi, tái cấu trúc là một cái gì đó rất khác với dọn dẹp . Khi thực hiện dọn dẹp, tôi không phải chạy thử nghiệm đơn vị nữa: nếu mã hoạt động trước, nó sẽ hoạt động sau khi dọn dẹp. Nói cách khác, không phải vì tôi đã xóa một dòng trống hoặc thêm một nhận xét rằng mã sẽ ngừng hoạt động. Mặt khác, khi tôi cấu trúc lại các phần phức tạp của một mã cũ, tôi có thể mắc một số lỗi, vì vậy tôi phải chạy thử nghiệm đơn vị sau khi tái cấu trúc.


4
Mặc dù tôi đồng ý rằng có một sự khác biệt cơ bản giữa dọn dẹp và bao thanh toán lại, có nhiều trường hợp dòng này làm mờ đi khá nhiều. Loại bỏ một lớp chết và "dọn dẹp" tất cả các tham chiếu đến nó khỏi chữ ký phương thức hoặc các hiệp hội còn lại sẽ được coi là làm sạch hoặc tái cấu trúc? Tôi cũng không đồng ý rằng việc chạy thử nghiệm đơn vị là tùy chọn. Bạn không biết làm thế nào mọi thứ có thể phá vỡ. Tôi đã thấy những thay đổi trong chuỗi thông báo của mã phá vỡ ngoại lệ vì ai đó nghĩ rằng đó là một ý tưởng tốt để phân tích nó để hành động trên một số lỗi.
Newtopian

Tôi phải đồng ý với Newtopian, đặc biệt là về việc không phải chạy lại các bài kiểm tra. Trên thực tế, cần có một bộ kiểm tra tự động chạy không ít hơn một lần cho mỗi lần xác nhận. Bất kể đó là dọn dẹp hay tái cấu trúc , nếu bạn có thay đổi mã để cam kết kiểm soát phiên bản, các thử nghiệm sẽ chạy.
kojiro

Bạn phải luôn luôn xây dựng đầy đủ sau khi thực hiện bất kỳ việc dọn dẹp nào - ngay cả khi đó chỉ là khoảng trắng và thay đổi nhận xét. Hỏi bất kỳ tác giả Python hoặc Makefile nào về điều đó.
JBRWilkinson

3

Tái cấu trúc thêm kiến ​​thức vào mã của bạn. Nếu bạn biết một cái gì đó được đặt tên không chính xác, bạn đặt cho nó một cái tên tốt hơn. Nếu bạn biết một cái gì đó có thể được thực hiện tốt hơn, bạn thay đổi nó thành một cái gì đó tốt hơn.

Đó là rất nhiều bước - nhỏ và lớn - hy vọng sẽ dẫn đến một chương trình tốt hơn.


3

Tôi đồng ý với "tái cấu trúc là một từ ưa thích để làm sạch mã của bạn" nhưng không phải với "chỉ". Mọi người sử dụng những từ ưa thích vì một lý do: đôi khi vì họ muốn trông thông minh, và đôi khi vì chúng mang ý nghĩa chính xác hơn hoặc chính xác hơn và IMHO tái cấu trúc (ngay cả khi đôi khi bị lạm dụng) thường đề cập đến cái sau.

"Dọn dẹp" có thể có nghĩa là bất cứ điều gì từ "định dạng lại một chút" đến "viết lại các khối lớn".

"Tái cấu trúc" có nghĩa cụ thể là một cái gì đó như "các thay đổi gia tăng nhỏ đối với mã, được thiết kế để duy trì cùng chức năng, đồng thời chuyển đổi nó thành một thiết kế tốt hơn". Và có một cơ thể thực hành tốt nhất về loại việc bạn làm: một số là đặc biệt, nhưng có những nguyên tắc chung, như sử dụng kiểm tra đơn vị, trích một phần chức năng vào các chức năng hoặc lớp mới, v.v., mọi người có thể và nên học .

Bạn nói "chỉ cần quản lý lừa để phân bổ thời gian để dọn sạch mã". Nhưng nếu nói "tái cấu trúc" truyền đạt chính xác khái niệm rằng đầu tư ổn định vào sự rõ ràng bây giờ sẽ trả cổ tức hiệu quả trong tương lai, thì đó không phải là một "mánh khóe", đó là truyền thông rõ ràng và hiệu quả.


2

Tái cấu trúc là mã hóa như Chuẩn hóa là dữ liệu quan hệ. Đó là một quá trình trừu tượng hóa các khái niệm thành các biểu diễn rõ ràng hơn, rõ ràng hơn và hiệu quả hơn về vai trò của chúng trong ứng dụng.


1
Đó là một cách thú vị để xem xét nó. Có thể nó xuất phát từ nền tảng cơ sở dữ liệu của tôi, nhưng có điều gì đó làm tôi khó chịu về sự căng thẳng trong việc tái cấu trúc và bạn đã giúp tôi đặt ngón tay lên nó. Đó là trong cơ sở dữ liệu, những gì bạn không sửa trong thiết kế sẽ mất gấp 10 lần để sửa trong thử nghiệm và có thể lâu hơn 1000 lần trong sản xuất. Vì vậy, một DBA tốt là hậu môn về việc làm mọi thứ ngay trong giai đoạn đầu càng tốt. Cảm giác ruột của tôi là quá nhiều thời gian tái cấu trúc ở các giai đoạn sau đó cho thấy quá ít thời gian dành cho thiết kế.
dùng21007

@ user21007: Mã phức tạp hơn nhiều so với lược đồ cơ sở dữ liệu, nhưng dễ dàng thay đổi và triển khai hơn rất nhiều.
kevin cline

1

Nó phụ thuộc vào cách bạn hiểu tái cấu trúc thuật ngữ. Đối với hầu hết mọi người, đây là một quá trình cải thiện cấu trúc mà không thay đổi hành vi. Nếu bạn đồng ý, thì có, nó đã được thực hiện từ lâu trước khi cuốn sách này ra mắt. Tôi biết, bởi vì tôi đã (trong số nhiều thứ khác) đổi tên các lớp, trích xuất các lớp và phương pháp trích xuất trước khi cuốn sách được viết. Tôi đã không gọi nó là tái cấu trúc, nhưng thực chất tôi đã làm chính xác điều tương tự.

Đối với cá nhân tôi, tái cấu trúc là cái mà bây giờ mọi người gọi là "tái cấu trúc mã tự động" tức là: hỗ trợ cho các kỹ thuật tái cấu trúc khác nhau trong IDE. Đây là một cải tiến thực sự cho những gì tôi đã làm trước đây (điều này thực sự rất đau đớn). Tôi có thể thực hiện thay đổi trong một lớp và không lo lắng điều này sẽ ảnh hưởng đến phần còn lại của phần mềm như thế nào. Tôi nghĩ rằng Martin đã chính thức tái cấu trúc kỹ thuật cho đến khi nó có thể được biểu diễn dưới dạng thuật toán và do đó được triển khai trong các IDE khác nhau ngoài kia.

Vì vậy, nếu bạn hiểu tái cấu trúc là một quá trình, thì nó không có gì mới. Nếu bạn thấy nó là tự động hóa, thì có, đó là một cải tiến rất lớn. Hãy thử đổi tên một vài lớp cốt lõi (theo nghĩa đen, không thông qua các tùy chọn tái cấu trúc IDE của bạn) trong một dự án lớn hợp lý để xem tại sao :)


0

Tái cấu trúc thực sự là mã "dọn dẹp", nhưng cũng tái cấu trúc mã. Trong nhóm của tôi tái cấu trúc thường là sau này. Khi chúng ta có trường hợp "tái cấu trúc", chúng ta phân bổ thời gian để cơ cấu lại mã của mình, ví dụ để làm cho nó phù hợp với kiến ​​trúc mới hoặc mô hình thông tin hoặc để làm cho nó hiệu quả hơn.

Mã "dọn dẹp" là thứ chúng tôi làm liên tục mà không có thời gian phân bổ đặc biệt cho nó. Đối với tôi "dọn dẹp" thường là đổi tên, dọn dẹp bình luận, v.v.


1
đổi tên là một kỹ thuật tái cấu trúc tiêu chuẩn!
Chuck Stephanski

0

Tôi muốn nói là không.

Có thể có dọn dẹp trong quá trình tái cấu trúc nhưng nó không phải là bản chất.

Dọn dẹp đi kèm với giả định rằng mã trước đó không sạch. Trong thực tế, các nhà phát triển cấu trúc lại mã của họ ngay cả mã gốc đã sạch.

DRY là một ổ đĩa quan trọng đằng sau tái cấu trúc.

Khi thêm mã mới vào cơ sở mã hiện có, việc tái cấu trúc được thực hiện một cách tự nhiên do nguyên tắc DRY.

Chỉ 0,02 của tôi


0

Làm sạch mã của bạn giống như dọn dẹp ngôi nhà của bạn, tái cấu trúc giống như phá bỏ một bức tường và có thể đặt nó lên một nơi khác


0

Khi người khác dọn dẹp nhà của bạn, bạn không thể tìm thấy bất cứ điều gì vì mục tiêu là dọn dẹp mọi thứ. Tái cấu trúc sẽ xây dựng và dán nhãn phòng, tủ, tủ, kệ, thùng, v.v ... Nó vẫn giữ hầu hết các thứ tương tự (bạn vẫn có thể làm bánh sandwich phô mai nướng trong bếp và ăn trong phòng khách), nhưng nên làm nó dễ dàng tìm thấy hơn và có thể có những nơi hiệu quả để đặt những thứ mới.


Tôi không cuồng tín, nhưng đôi khi các nhiệm vụ thông thường cần được dán nhãn và chính thức hóa để mọi người biết bạn đang nói về điều gì. Một khách hàng báo cáo lỗi và người quản lý hét lên: "Hãy dọn sạch mã của bạn!" bạn biết họ không nói về tái cấu trúc.
JeffO

0

Thuật ngữ 'tái cấu trúc' được mượn một cách tao nhã từ đại số. Nó có nghĩa là đơn giản hóa các điều khoản để tạo ra kết quả tương tự. Không chỉ thanh lịch, nó còn mang tính cách mạng - nó đòi hỏi một cách tiếp cận hữu hạn đối với mã của bạn, ở một mức độ khiến nhiều người ngạc nhiên. Và vì vậy, thuật ngữ này rất có ý nghĩa và hữu ích.


-1

Không. Tái cấu trúc là cải thiện cấu trúc mà không thay đổi hành vi. Tái cấu trúc theo nghĩa chặt chẽ đòi hỏi kỷ luật kiểm tra tốt. Điều đó không nhất thiết phải có khi bạn "dọn dẹp mọi thứ".


2
thái độ nguy hiểm. Loại bỏ toàn bộ mã chết và cấu hình chết đang dọn dẹp và thay đổi chữ ký của một phương thức duy nhất một bộ tái cấu trúc. Tuy nhiên, trong cả hai trường hợp, tôi muốn có được một kỷ luật kiểm tra tốt để đảm bảo rằng tôi đã không phá vỡ bất cứ điều gì.
Newtopian

Tôi không nói rằng đó là một điều tốt / an toàn / mong muốn để thực hiện những thay đổi lớn mà không có kỷ luật kiểm tra. Tôi đang nói rằng tái cấu trúc như một phương pháp liên quan đến kỷ luật kiểm tra, trong khi "làm sạch mọi thứ" hoàn toàn không phải là một phương pháp.
Willie Wheeler

Vì vậy, nếu tôi hiểu chính xác nếu nó không có một cái tên ưa thích thì chúng ta nên đi !! : -O đùa thôi, tôi thấy những gì bạn đang cố nói, đúng là việc dọn dẹp mọi thứ khó có thể được gọi là một phương pháp nhưng sau đó lại không phải là tái cấu trúc. Đó chỉ là một từ ưa thích nói rằng bạn đang thay đổi mã mà không thay đổi hành vi của nó. Bản thân nó không có ý nghĩa gì trong việc thử nghiệm bất cứ điều gì. Theo cách thực hành mã hóa tốt sẽ nói rằng nếu mã thay đổi thì nó sẽ được kiểm tra bất kể bạn gọi hành động đã tạo ra thay đổi như thế nào.
Newtopian

1
Chắc chắn, tôi có thể mua nó. Kỷ luật kiểm tra là về cách người ta thực hiện tái cấu trúc, nhưng nó không phải là vốn có trong định nghĩa. (Tức là tôi có thể cấu trúc lại mã mà không cần bất kỳ thử nghiệm nào.) Tôi không biết liệu tôi có thể đồng ý rằng tái cấu trúc không phải là một phương pháp hay không - có toàn bộ sách được viết với các mẫu từng bước và vv.
Willie Wheeler

-1

Hai cái chồng lên nhau một chút ở các cạnh, nhưng với tôi đó là sự khác biệt giữa dọn dẹp nhà cửa và tu sửa nhà. Dọn dẹp, với tôi, không ngụ ý thay đổi cấu trúc, trong khi tái cấu trúc.


-2

"Tái cấu trúc" thực sự giống như "kiến trúc tìm kiếm", nhưng với ý nghĩa mạnh mẽ hơn là "không thay đổi chức năng". Nó cũng rõ ràng hơn về mục tiêu tái kiến ​​trúc, thường là "nhân tố" mã chung thành các đoạn có thể tái sử dụng.

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.