Tôi có thể đẩy tái cấu trúc bao xa mà không thay đổi hành vi bên ngoài?


27

Theo Martin Fowler , tái cấu trúc mã là (nhấn mạnh của tôi):

Tái cấu trúc là một kỹ thuật có kỷ luật để tái cấu trúc một bộ mã hiện có, thay đổi cấu trúc bên trong của nó mà không thay đổi hành vi bên ngoài của nó . Trái tim của nó là một chuỗi các hành vi nhỏ bảo tồn các biến đổi. Mỗi phép biến đổi (được gọi là 'tái cấu trúc') thực hiện rất ít, nhưng một chuỗi các phép biến đổi có thể tạo ra sự tái cấu trúc đáng kể. Vì mỗi lần tái cấu trúc là nhỏ, nên nó ít có khả năng sai. Hệ thống cũng được duy trì hoạt động hoàn toàn sau mỗi lần tái cấu trúc nhỏ, làm giảm khả năng hệ thống có thể bị hỏng nghiêm trọng trong quá trình tái cấu trúc.

"Hành vi bên ngoài" trong bối cảnh này là gì? Ví dụ, nếu tôi áp dụng tái cấu trúc phương thức di chuyển và chuyển một số phương thức sang lớp khác, có vẻ như tôi thay đổi hành vi bên ngoài, phải không?

Vì vậy, tôi quan tâm đến việc tìm ra điểm thay đổi nào là điểm tái cấu trúc và trở thành một thứ gì đó nhiều hơn. Thuật ngữ "tái cấu trúc" có thể bị sử dụng sai cho các thay đổi lớn hơn: có một từ khác cho nó không?

Cập nhật. Rất nhiều câu trả lời thú vị về giao diện, nhưng sẽ không di chuyển phương thức tái cấu trúc thay đổi giao diện?


Nếu hành vi hiện tại hút hoặc không đầy đủ, sau đó sửa đổi, xóa / viết lại. Bạn có thể không được bao thanh toán lại sau đó, nhưng ai quan tâm tên đó là gì nếu hệ thống sẽ (phải không?) Trở nên tốt hơn do kết quả của điều đó.
Công việc

2
Người giám sát của bạn có thể quan tâm nếu bạn được phép tái cấu trúc và bạn đã viết lại.
JeffO

2
Ranh giới của tái cấu trúc là các bài kiểm tra đơn vị. Nếu bạn có một đặc tả được vẽ bởi họ, bất cứ điều gì bạn thay đổi mà không phá vỡ các bài kiểm tra là tái cấu trúc?
George Silva

1
Câu hỏi tương tự trên SO stackoverflow.com/questions/1025844/ Từ
sylvanaar

Nếu bạn muốn tìm hiểu thêm, chủ đề này cũng là một lĩnh vực nghiên cứu tích cực. Có rất nhiều bài báo khoa học về chủ đề này, ví dụ như, informatik.uni-trier.de/~ley/db/indices/a-tree/s/...
Skarab

Câu trả lời:


25

"Bên ngoài" trong ngữ cảnh này có nghĩa là "có thể quan sát được cho người dùng". Người dùng có thể là con người trong trường hợp ứng dụng hoặc các chương trình khác trong trường hợp API công khai.

Vì vậy, nếu bạn di chuyển phương thức M từ lớp A sang lớp B và cả hai lớp đều nằm sâu trong một ứng dụng và không người dùng nào có thể quan sát bất kỳ thay đổi nào trong hành vi của ứng dụng do thay đổi, thì bạn có thể gọi nó là tái cấu trúc.

Nếu, OTOH, một số hệ thống / thành phần con cấp cao khác thay đổi hành vi hoặc phá vỡ do thay đổi, đó thực sự là (thường) có thể quan sát được đối với người dùng (hoặc ít nhất là đối với nhật ký kiểm tra sysadins). Hoặc nếu các lớp của bạn là một phần của API công khai, có thể có mã bên thứ 3 ngoài đó phụ thuộc vào M là một phần của lớp A, chứ không phải B. Vì vậy, cả hai trường hợp này đều không được cấu trúc lại theo nghĩa nghiêm ngặt.

có một xu hướng gọi bất kỳ mã làm lại nào là tái cấu trúc, theo tôi đoán là không chính xác.

Thật vậy, đó là một hậu quả đáng buồn nhưng được mong đợi của việc tái cấu trúc trở thành mốt. Các nhà phát triển đã thực hiện việc làm lại mã theo cách thức không thường xuyên từ lâu và chắc chắn việc học một từ thông dụng mới dễ dàng hơn là phân tích và thay đổi thói quen ăn sâu.

Vì vậy, từ thích hợp cho việc làm lại thay đổi hành vi bên ngoài là gì?

Tôi sẽ gọi nó là thiết kế lại .

Cập nhật

Rất nhiều câu trả lời thú vị về giao diện, nhưng sẽ không di chuyển phương thức tái cấu trúc thay đổi giao diện?

Của cái gì? Các lớp học cụ thể, vâng. Nhưng những lớp học này có thể nhìn thấy trực tiếp ra thế giới bên ngoài theo bất kỳ cách nào? Nếu không - bởi vì chúng nằm trong chương trình của bạn và không phải là một phần của giao diện bên ngoài (API / GUI) của chương trình - không có sự thay đổi nào được thực hiện bởi các bên ngoài (tất nhiên trừ khi thay đổi phá vỡ điều gì đó).

Tôi cảm thấy rằng có một câu hỏi sâu sắc hơn thế này: liệu một lớp cụ thể có tồn tại như một thực thể độc lập không? Trong hầu hết các trường hợp, câu trả lời là không : lớp chỉ tồn tại như một phần của thành phần lớn hơn, hệ sinh thái của các lớp và đối tượng, mà không có nó không thể được khởi tạo và / hoặc không thể sử dụng được. Hệ sinh thái này không chỉ bao gồm các phụ thuộc (trực tiếp / gián tiếp) mà còn bao gồm các lớp / đối tượng khác phụ thuộc vào nó. Điều này là do không có các lớp cấp cao hơn này, trách nhiệm liên quan đến lớp của chúng tôi có thể là vô nghĩa / vô dụng đối với người dùng hệ thống.

Ví dụ, trong dự án của chúng tôi liên quan đến cho thuê xe, có một Chargelớp học. Lớp này không sử dụng cho chính người dùng hệ thống, bởi vì các đại lý trạm cho thuê và khách hàng không thể làm gì nhiều với một khoản phí riêng lẻ: họ giải quyết toàn bộ hợp đồng cho thuê (bao gồm một loạt các loại phí khác nhau) . Người dùng chủ yếu quan tâm đến tổng số các khoản phí này, cuối cùng họ phải trả; đại lý quan tâm đến các lựa chọn hợp đồng khác nhau, thời gian thuê, nhóm xe, gói bảo hiểm, các mặt hàng phụ, v.v. được chọn, (thông qua các quy tắc kinh doanh tinh vi) chi phối các khoản phí được trình bày và cách tính khoản thanh toán cuối cùng ra khỏi những. Và đại diện quốc gia / nhà phân tích kinh doanh quan tâm đến các quy tắc kinh doanh cụ thể, sức mạnh tổng hợp và tác động của họ (đối với thu nhập của công ty, v.v.).

Gần đây tôi đã tái cấu trúc lớp này, đổi tên hầu hết các trường và phương thức của nó (để tuân theo quy ước đặt tên Java tiêu chuẩn, hoàn toàn bị bỏ qua bởi những người đi trước của chúng tôi). Tôi cũng có kế hoạch tái cấu trúc hơn nữa để thay thế Stringcharcác lĩnh vực với các loại enumvà phù hợp hơn boolean. Tất cả điều này chắc chắn sẽ thay đổi giao diện của lớp, nhưng (nếu tôi thực hiện đúng công việc của mình) thì không ai trong số đó sẽ hiển thị cho người dùng ứng dụng của chúng tôi. Không ai trong số họ quan tâm đến cách tính phí riêng lẻ, mặc dù họ chắc chắn biết khái niệm về phí. Tôi có thể đã chọn làm ví dụ cho hàng trăm lớp khác không đại diện cho bất kỳ khái niệm miền nào, do đó thậm chí còn vô hình về mặt khái niệm đối với người dùng cuối, nhưng tôi nghĩ sẽ thú vị hơn khi chọn một ví dụ có ít nhất khả năng hiển thị ở cấp độ khái niệm. Điều này cho thấy độc đáo rằng các giao diện lớp chỉ là đại diện cho các khái niệm miền (tốt nhất), không phải là thực tế *. Các đại diện có thể được thay đổi mà không ảnh hưởng đến khái niệm. Và người dùng chỉ có và hiểu khái niệm; nhiệm vụ của chúng ta là thực hiện ánh xạ giữa khái niệm và biểu diễn.

* Và người ta có thể dễ dàng thêm rằng mô hình miền, mà lớp chúng ta đại diện, bản thân nó chỉ là một đại diện gần đúng của một số "thực tế" ...


3
nitpicking, tôi sẽ nói 'thay đổi thiết kế' không phải thiết kế lại. thiết kế lại âm thanh quá đáng kể.
dùng606723

4
thú vị - trong ví dụ lớp A của bạn là 'cơ thể mã hiện có "và nếu phương thức M là công khai thì hành vi bên ngoài của A đang được thay đổi. Vì vậy, bạn có thể nói rằng lớp A được thiết kế lại, trong khi toàn bộ hệ thống đang được tái cấu trúc.
saus

Tôi thích quan sát cho người dùng. Đó là lý do tại sao tôi không nói các bài kiểm tra đơn vị phá vỡ là một dấu hiệu, nhưng thay vì kết thúc để kết thúc hoặc kiểm tra tích hợp sẽ là một dấu hiệu.
Andy Wiesendanger

8

Bên ngoài đơn giản có nghĩa là giao diện trong ý nghĩa ngôn ngữ thực sự của nó. Hãy xem xét một con bò cho ví dụ này. Miễn là bạn cho một số loại rau và lấy sữa làm giá trị hoàn trả, bạn không quan tâm đến cách các cơ quan nội tạng của nó hoạt động. Bây giờ nếu Chúa thay đổi nội tạng bò, để máu của nó có màu xanh lam, miễn là điểm vào và điểm thoát (miệng và sữa) không thay đổi, nó có thể được coi là tái cấu trúc.


1
Tôi không nghĩ đó là một câu trả lời hay. Tái cấu trúc có thể ngụ ý thay đổi API. Nhưng nó không ảnh hưởng đến người dùng cuối hoặc cách đọc / tạo tệp đầu vào.
rds

3

Đối với tôi, tái cấu trúc là hiệu quả / thoải mái nhất khi các ranh giới được đặt bằng các thử nghiệm và / hoặc theo đặc tả chính thức.

  • Các ranh giới này đủ cứng nhắc để khiến tôi cảm thấy an toàn khi biết rằng nếu tôi thỉnh thoảng vượt qua, nó sẽ được phát hiện sớm để tôi không phải quay lại nhiều thay đổi để phục hồi. Mặt khác, những thứ này cung cấp đủ thời gian để cải thiện mã mà không lo thay đổi hành vi không liên quan.

  • Điều tôi đặc biệt thích là những loại ranh giới này có thể thích ứng để nói. Ý tôi là, 1) Tôi thực hiện thay đổi và xác minh rằng nó tuân thủ thông số / kiểm tra. Sau đó, 2) nó được chuyển đến QA hoặc kiểm tra người dùng - lưu ý ở đây, nó vẫn có thể thất bại vì thiếu một cái gì đó trong spec / tests. Được rồi, nếu 3a) kiểm tra vượt qua, tôi đã xong, tốt thôi. Mặt khác, nếu thử nghiệm 3b) không thành công thì tôi 4) khôi phục lại thay đổi 5) thêm thử nghiệm hoặc làm rõ thông số kỹ thuật để lần sau lỗi này không lặp lại. Lưu ý rằng bất kể việc kiểm tra vượt qua hay thất bại, tôi đều đạt được điều gì đó - một trong hai mã / kiểm tra / thông số kỹ thuật được cải thiện - những nỗ lực của tôi không biến thành lãng phí hoàn toàn.

Đối với các loại ranh giới khác - cho đến nay, tôi không gặp nhiều may mắn.

"Có thể quan sát được với người dùng" là đặt cược an toàn nếu một người có kỷ luật tuân theo nó - điều mà theo tôi bằng cách nào đó luôn liên quan đến nhiều nỗ lực trong việc phân tích / tạo ra các thử nghiệm mới - có thể là quá nhiều nỗ lực. Một điều nữa tôi không thích về cách tiếp cận này là việc mù quáng theo nó có thể trở nên quá hạn chế. - Thay đổi này bị cấm vì với việc tải dữ liệu sẽ mất 3 giây thay vì 2. - Làm thế nào để kiểm tra với người dùng / chuyên gia UX xem điều này có liên quan hay không? - Không có cách nào, bất kỳ thay đổi trong hành vi quan sát được đều bị cấm, thời gian. An toàn? bạn đặt cược năng suất? không thực sự

Một cách khác tôi đã cố gắng là giữ logic logic (cách tôi hiểu nó khi đọc). Ngoại trừ những thay đổi cơ bản nhất (và thường không có kết quả), cái này luôn luôn là một con giun ... hay tôi nên nói là một con bọ? Tôi có nghĩa là lỗi hồi quy. Thật quá dễ dàng để phá vỡ một cái gì đó quan trọng khi làm việc với mã spaghetti.


3

Các Refactoring cuốn sách là khá mạnh trong thông điệp của mình mà bạn có thể chỉ thực hiện refactoring khi bạn có bảo hiểm đơn vị kiểm tra .

Do đó, bạn có thể nói rằng miễn là bạn không phá vỡ bất kỳ bài kiểm tra đơn vị nào, bạn sẽ tái cấu trúc . Khi bạn phá vỡ các bài kiểm tra, bạn sẽ không tái cấu trúc nữa.

Nhưng: làm thế nào về các phép tái cấu trúc đơn giản như thay đổi tên của các lớp hoặc thành viên? Họ không phá vỡ các bài kiểm tra?

Có, họ làm như vậy, và trong từng trường hợp, bạn sẽ cần xem xét liệu sự phá vỡ đó có đáng kể hay không. Nếu SUT của bạn là API / SDK công khai thì thực sự đổi tên là một sự thay đổi đột phá. Nếu không, nó có thể ổn.

Tuy nhiên, hãy xem xét điều đó thường xuyên, các bài kiểm tra bị phá vỡ không phải vì bạn đã thay đổi hành vi mà bạn thực sự quan tâm, mà vì các bài kiểm tra là Bài kiểm tra dễ vỡ .


3

Cách tốt nhất để xác định "hành vi bên ngoài", trong ngữ cảnh này, có thể là "trường hợp thử nghiệm".

Nếu bạn cấu trúc lại mã và nó tiếp tục vượt qua các trường hợp thử nghiệm (được xác định trước khi tái cấu trúc), thì việc tái cấu trúc đã không thay đổi hành vi bên ngoài. Nếu một hoặc nhiều trường hợp kiểm tra thất bại, thì bạn đã thay đổi hành vi bên ngoài.

Ít nhất, đó là sự hiểu biết của tôi về các cuốn sách khác nhau được xuất bản về chủ đề này (ví dụ, Fowler's).


2

Ranh giới sẽ là ranh giới cho biết ai là người phát triển, duy trì, hỗ trợ dự án và những người sử dụng nó ngoài những người ủng hộ, người bảo trì, nhà phát triển. Vì vậy, với thế giới bên ngoài, hành vi trông giống nhau trong khi các cấu trúc bên trong đằng sau hành vi đã thay đổi.

Vì vậy, sẽ ổn khi di chuyển các chức năng giữa các lớp miễn là chúng không phải là những chức năng mà người dùng nhìn thấy.

Miễn là việc làm lại mã không thay đổi các hành vi bên ngoài, thêm các chức năng mới hoặc loại bỏ các chức năng hiện có, tôi đoán sẽ ổn khi gọi việc làm lại là tái cấu trúc.


Không đồng ý. Nếu bạn thay thế toàn bộ mã truy cập dữ liệu của mình bằng nHibernate, nó sẽ không thay đổi hành vi bên ngoài nhưng nó không tuân theo "kỹ thuật kỷ luật" của Fowler. Điều này sẽ được tái cấu trúc và gọi nó là tái cấu trúc che giấu các yếu tố rủi ro liên quan.
pdr

1

Với tất cả sự tôn trọng, chúng ta phải nhớ rằng người dùng của một lớp không phải là người dùng cuối của các ứng dụng được xây dựng với lớp đó, mà là các lớp được triển khai bằng cách sử dụng - gọi hoặc thừa kế từ - lớp được tái cấu trúc .

Khi bạn nói rằng "hành vi bên ngoài không nên thay đổi", bạn có nghĩa là theo như người dùng quan tâm, lớp sẽ hành xử chính xác như trước đây. Có thể là việc triển khai ban đầu (chưa được tái cấu trúc) là một lớp duy nhất và việc triển khai (tái cấu trúc) mới có một hoặc nhiều siêu lớp mà lớp đó được xây dựng, nhưng người dùng không bao giờ nhìn thấy bên trong (việc thực hiện) Chỉ thấy giao diện.

Vì vậy, nếu một lớp có một phương thức gọi là "doS SomethingAmazed" thì điều đó không thành vấn đề với người dùng nếu điều đó được thực hiện bởi lớp mà họ đang đề cập hoặc bởi một siêu lớp mà lớp đó được xây dựng. Tất cả những gì quan trọng đối với người dùng là "doS SomethingAmazed" mới (được tái cấu trúc) có kết quả tương tự như "doS SomethingAmazed" mới (chưa được tái cấu trúc).

Tuy nhiên, cái được gọi là tái cấu trúc trong nhiều trường hợp không phải là tái cấu trúc thực sự, nhưng có lẽ việc tái cấu trúc được thực hiện để làm cho mã dễ sửa đổi hơn để thêm một số tính năng mới. Vì vậy, trong trường hợp sau này của tái cấu trúc (giả), mã mới (được tái cấu trúc) thực sự làm một cái gì đó khác biệt, hoặc có lẽ là một cái gì đó nhiều hơn cái cũ.


Điều gì sẽ xảy ra nếu một hình thức cửa sổ được sử dụng để bật lên hộp thoại "Bạn có chắc chắn muốn nhấn nút OK không?" và tôi đã quyết định loại bỏ nó bởi vì nó hoàn thành tốt và gây khó chịu cho người dùng, sau đó tôi đã xác nhận lại mã, thiết kế lại nó, sửa đổi nó, gỡ lỗi, khác?
Công việc

@job: bạn đã thay đổi chương trình để đáp ứng thông số kỹ thuật mới.
jmoreno

IMHO bạn có thể được trộn lẫn các tiêu chí khác nhau ở đây. Viết lại mã từ đầu thực sự không phải là tái cấu trúc, nhưng điều này là bất kể nó có thay đổi hành vi bên ngoài hay không. Ngoài ra, nếu thay đổi giao diện lớp không được cấu trúc lại, thì làm thế nào Move Move et al. tồn tại trong danh mục tái cấu trúc ?
Péter Török

@ Péter Török - Nó hoàn toàn phụ thuộc vào ý của bạn bằng cách "thay đổi giao diện lớp" bởi vì trong ngôn ngữ OOP thực hiện sự kế thừa, giao diện của một lớp không chỉ bao gồm những gì được tổ chức bởi chính tổ tiên của nó. Thay đổi giao diện lớp có nghĩa là xóa / thêm một phương thức vào giao diện (hoặc thay đổi chữ ký của một phương thức - tức là số một loại tham số được truyền). Tái cấu trúc có nghĩa là ai đang trả lời phương thức, lớp hoặc siêu lớp.
Zeke Hansell

IMHO - toàn bộ câu hỏi này có thể quá bí truyền để có giá trị hữu ích cho các lập trình viên.
Zeke Hansell

1

Bằng "hành vi bên ngoài" chủ yếu là anh ta đang nói về giao diện công cộng, nhưng điều này cũng bao gồm cả kết quả đầu ra / tạo tác của hệ thống. (tức là bạn có một phương thức tạo tệp, thay đổi định dạng của tệp sẽ thay đổi hành vi bên ngoài)

e: Tôi sẽ coi "phương pháp di chuyển" là một sự thay đổi đối với hành vi bên ngoài. Hãy nhớ rằng Fowler đang nói về các cơ sở mã hiện có đã được phát hành ngoài tự nhiên. Tùy thuộc vào tình huống của bạn, bạn có thể xác minh rằng thay đổi của bạn không phá vỡ bất kỳ khách hàng bên ngoài nào và tiếp tục theo cách vui vẻ của bạn.

e2: "Vậy từ nào phù hợp để làm lại thay đổi hành vi bên ngoài?" - Tái cấu trúc API, Thay đổi đột phá, v.v ... nó vẫn tái cấu trúc, nó chỉ không tuân theo các thực tiễn tốt nhất để tái cấu trúc một giao diện công cộng vốn đã có sẵn với các máy khách.


Nhưng nếu anh ta đang nói về một giao diện công cộng, vậy còn tái cấu trúc "Phương thức di chuyển" thì sao?
SiberianGuy

@Idsa Chỉnh sửa câu trả lời của tôi để giải quyết câu hỏi của bạn.

@kekela, nhưng vẫn chưa rõ ràng với tôi về việc "tái cấu trúc" này kết thúc ở đâu
SiberianGuy

@idsa Theo định nghĩa bạn đã đăng, nó không còn là cấu trúc lại phút mà bạn thay đổi giao diện công cộng. (chuyển một phương thức công khai từ lớp này sang lớp khác sẽ là một ví dụ về điều này)

0

"Phương pháp di chuyển" là một kỹ thuật tái cấu trúc, không phải là tái cấu trúc. Tái cấu trúc là quá trình áp dụng một số kỹ thuật tái cấu trúc cho các lớp. Ở đó, khi bạn nói, tôi đã áp dụng "phương thức di chuyển" cho một lớp, bạn thực sự không có nghĩa là "Tôi tái cấu trúc (lớp)", bạn thực sự có nghĩa là "Tôi đã áp dụng một kỹ thuật tái cấu trúc trên lớp đó". Tái cấu trúc, trong đó, ý nghĩa thuần túy nhất được áp dụng cho thiết kế, hoặc cụ thể hơn, đối với một số phần của thiết kế ứng dụng có thể được xem như một hộp đen.

Bạn có thể nói rằng "tái cấu trúc" được sử dụng trong ngữ cảnh của các lớp, có nghĩa là "kỹ thuật tái cấu trúc", do đó "phương thức di chuyển" không phá vỡ định nghĩa của quá trình tái cấu trúc. Trên cùng một trang, "tái cấu trúc" trong ngữ cảnh thiết kế, không phá vỡ các tính năng hiện có trong mã, nó chỉ "phá vỡ" thiết kế (dù sao đó cũng là mục đích của nó).

Để kết luận, "ranh giới", được đề cập trong câu hỏi, được gạch chéo nếu bạn nhầm lẫn (trộn: D) tái cấu trúc-kỹ thuật với tái cấu trúc-quy trình.

PS: Câu hỏi hay, btw.


Đọc nó nhiều lần, nhưng vẫn không hiểu được
SiberianGuy

phần nào bạn không hiểu? (có tái cấu trúc-quy trình mà định nghĩa của bạn áp dụng hoặc tái cấu trúc-kỹ thuật, trong ví dụ của bạn, phương thức di chuyển, mà định nghĩa không áp dụng; do đó, phương thức di chuyển không phá vỡ định nghĩa về tái cấu trúc-the- quá trình, hoặc không vượt qua ranh giới của nó, bất kể chúng là gì). Tôi đang nói rằng mối quan tâm bạn không nên tồn tại cho ví dụ của bạn. ranh giới của tái cấu trúc không phải là một cái gì đó mờ nhạt. bạn chỉ đang áp dụng một định nghĩa của một cái gì đó cho một cái gì đó khác.
Belun

0

nếu bạn nói về các số bao thanh toán, thì bạn đang mô tả nhóm các số nguyên mà khi nhân với nhau bằng số bắt đầu. Nếu chúng ta lấy định nghĩa này để bao thanh toán và áp dụng nó cho công cụ tái cấu trúc thuật ngữ lập trình, thì việc tái cấu trúc sẽ chia một chương trình thành các đơn vị logic nhỏ nhất, để khi chúng được chạy như một chương trình, tạo ra cùng một đầu ra (cho cùng một đầu vào ) như chương trình ban đầu.


0

Các ranh giới của tái cấu trúc là cụ thể cho một tái cấu trúc nhất định. Đơn giản là không thể có một câu trả lời và bao gồm tất cả mọi thứ. Một lý do là thuật ngữ tái cấu trúc là không cụ thể.

Bạn có thể cấu trúc lại:

  • Mã nguồn
  • Kiến trúc chương trình
  • Thiết kế giao diện người dùng / Tương tác người dùng

và tôi chắc chắn một số điều khác.

Có lẽ refactor có thể được định nghĩa là

"một hành động hoặc tập hợp các hành động làm giảm entropy trong một hệ thống cụ thể"


0

Chắc chắn có một số giới hạn về khoảng cách bạn có thể tái cấu trúc. Xem: Khi hai thuật toán giống nhau?

Mọi người thường coi các thuật toán là trừu tượng hơn các chương trình thực hiện chúng. Cách tự nhiên để chính thức hóa ý tưởng này là các thuật toán là các lớp chương trình tương đương đối với mối quan hệ tương đương phù hợp. Chúng tôi lập luận rằng không có mối quan hệ tương đương như vậy tồn tại.

Vì vậy, đừng đi quá xa, hoặc bạn sẽ không tin tưởng vào kết quả. Mặt khác, kinh nghiệm cho thấy rằng bạn thường có thể thay thế một thuật toán này bằng một thuật toán khác và nhận được cùng một câu trả lời, đôi khi nhanh hơn. Đó là vẻ đẹp của nó, hả?


0

Bạn có thể nghĩ về ý nghĩa bên ngoài của Viking

Bên ngoài để đứng lên hàng ngày.

Vì vậy, bất kỳ thay đổi nào đối với hệ thống không ảnh hưởng đến lợn, có thể được coi là tái cấu trúc.

Thay đổi giao diện lớp không phải là vấn đề, nếu lớp chỉ được sử dụng bởi một hệ thống duy nhất được xây dựng và duy trì bởi nhóm của bạn. Tuy nhiên, nếu lớp là một lớp công khai trong khung .net được sử dụng bởi mọi lập trình viên .net thì đó là một vấn đề rất khác.

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.