Đây có phải là mùi mã để gọi phương thức công khai trong phương thức riêng của cùng một đối tượng không?
Đây có phải là mùi mã để gọi phương thức công khai trong phương thức riêng của cùng một đối tượng không?
Câu trả lời:
Không có mùi không tệ. Điều này có thể cần thiết, tại sao bạn nghi ngờ nó sai? Một phương thức ở cấp độ nguyên tử là một thực thể độc lập thực hiện một nhiệm vụ. Miễn là nó thực hiện một nhiệm vụ bất cứ ai có quyền truy cập vào nó đều có thể gọi nó để hoàn thành nhiệm vụ.
Mùi mã? Vâng, không phải là một thực sự xấu, nhưng một chỉ số tốt rằng lớp có thể có quá nhiều trách nhiệm.
Hãy coi đó là một dấu hiệu cho thấy lớp có thể cần được chia thành các đối tượng khác nhau, các phương thức riêng không thực sự cần phải gọi các phương thức công khai của cùng một đối tượng, chắc chắn trong một thiết kế OO sạch.
Tất nhiên, một khi bạn đã kiểm tra lớp và lý do của lệnh gọi phương thức là rõ ràng, thì đó có thể là một cách sử dụng hoàn toàn hợp lý, nói chung, bạn mong đợi các phương thức tiện ích cho lớp là riêng tư, nhưng nếu một phương thức đủ hữu ích để công khai và được sử dụng bởi các phương pháp khác, nói chung, tôi mong muốn các phương thức đó cũng được công khai.
Như với tất cả các mã có mùi, đây là một động lực để kiểm tra mã hơn nữa, hợp lý hóa và có thể tái cấu trúc, nhưng không phải là một nguyên nhân để báo động.
Nó có thể dẫn đến những bất ngờ khó chịu nếu ai đó chưa đọc mã nguồn của lớp này cố gắng phân lớp nó và ghi đè phương thức công khai. Cho dù đó là một mối quan tâm thực sự rõ ràng phụ thuộc vào tình huống của bạn. Có lẽ bạn nên xem xét việc thực hiện phương pháp công khai hoặc thậm chí là lớp cuối cùng.
Không. Những gì khác nên được thực hiện trong trường hợp đó? Làm cho phương thức riêng tư công khai hay phương thức công khai riêng tư? Sao chép-Dán mã từ phương thức công khai sang phương thức riêng tư?
KHÔNG , không có mùi hôi ở đây.
Nếu chúng ta thực hiện giao diện của một hàng đợi với Danh sách, có phải là mùi khó chịu khi chỉ gọi các chức năng Danh sách thích hợp để đạt được việc thực hiện hàng đợi một cách dễ dàng?
nếu bạn có một cái gì đó và bạn muốn chuyển đổi nó thành một thứ khác (như trình bao bọc) thì nó không phải là mùi khó chịu, mã của nó có thể sử dụng lại với mẫu thiết kế được thực hiện ở cấp độ chức năng (là một chức năng một đối tượng?)
Tôi biết đây là một bài viết cũ, nhưng đó là điều mà tôi đã tranh luận trong công việc. Tôi 'coi' đây là mùi mã và không thể hiểu tại sao bạn lại muốn làm điều này. Nếu một phương thức riêng phải gọi một phương thức công khai, thì nội dung của phương thức chung sẽ được lấy và đặt trong một phương thức riêng, mà cả hai phương thức đều có thể gọi. Tại sao?
Phương thức công khai có thể chứa các kiểm tra không cần thiết sau khi mã thực thi của bạn bên trong. Nó có thể nhận được UserObj và muốn kiểm tra quyền của người dùng chẳng hạn.
Sau cuộc gọi công khai, bạn có thể có yêu cầu khóa đối tượng, nếu bạn đang sử dụng luồng, vì vậy, bên trong, bạn sẽ không muốn gọi lại cho phương thức công khai.
Theo tôi, nhiều khả năng giới thiệu các lỗi tròn và các vòng lặp vô hạn và theo các ngoại lệ mem theo ý kiến của tôi.
Đơn giản và đơn giản, thiết kế xấu và "lười biếng". Phương pháp công cộng cung cấp quyền truy cập vào thế giới bên ngoài. Không có lý do để quay trở lại bên ngoài khi bạn đã ở trong.
Hãy tưởng tượng ngược lại. Bạn đang ở trong một phương thức riêng tư và bạn cần chức năng trong một phương thức công khai Điều gì xảy ra nếu bạn không thể gọi phương thức công khai đó từ phương thức riêng tư. Bạn sẽ làm gì?
Câu trả lời rõ ràng là khi bạn muốn chức năng trong một phương thức công khai, bạn sẽ có thể gọi phương thức đó từ các phương thức của lớp này hoặc từ các lớp khác.
Trong mã của tôi, tôi thường tạo ra các trình tải tải lười biếng, nghĩa là đối tượng được khởi tạo lần đầu tiên khi nó được yêu cầu và sau đó sử dụng lại cùng một đối tượng được khởi tạo. Tuy nhiên, một đối tượng được khởi tạo bằng cách sử dụng tải lười biếng ngụ ý rằng nó có thể không nhất thiết phải được khởi tạo tại bất kỳ điểm nào. Thay vì quấn đầu xung quanh chuỗi các cuộc gọi để tôi biết rằng đối tượng đó đã được khởi tạo hoặc lặp lại cùng một mã của một tải lười biếng bên trong một phương thức khác, tôi chỉ cần gọi trình tải lười biếng bất cứ khi nào tôi cần đối tượng đó.
Giống như bạn có thể sử dụng các phương thức công khai một cách thông minh, bạn cũng có thể sử dụng chúng không chính xác. Một ví dụ về điều này có thể là một phương thức công khai xử lý các tham số của nó trước khi gọi một phương thức riêng tư khác. Sẽ là một sai lầm nếu gọi phương thức công khai đó một cách tình cờ đơn giản chỉ vì bạn có cùng tham số. Lỗi là tinh tế nhưng đó là lỗi thiết kế hơn bất kỳ điều gì khác và yêu cầu bạn học cách quản lý với các tham số của phương thức bên trong hơn là các tham số của phương thức chung.
Vì vậy, để trả lời câu hỏi của bạn, chắc chắn đó không phải là mã xấu nếu bạn sử dụng đúng.
Câu hỏi bạn cần tự hỏi mình là tại sao lớp học của bạn có cùng nhu cầu với khách hàng của lớp bạn? Thông thường một lớp có nhu cầu rất khác nhau từ khách hàng của nó. Vì vậy, có, đây là một dấu hiệu cho thấy bạn có một trong hai
(a) phơi bày một cái gì đó công khai mà nên riêng tư; hoặc là
(b) hành vi của lớp không đủ hẹp (nghĩ nguyên tắc trách nhiệm duy nhất).