Tôi không có chuyên gia, nhưng tôi đang cố gắng hiểu nếu có một lỗ hổng trong logic của tôi ở đây. Tôi chắc rằng nó sẽ không mất nhiều thời gian để có nó chỉ ra nếu như vậy!Có cách nào để sử dụng cấu trúc làm đầu vào cho phương thức không?
Thay vì xác định một số tham số trên phương pháp chung, tại sao không chỉ đơn giản có cấu trúc làm tham số đầu vào đơn? Nếu mỗi tham số được xác định riêng và một tham số khác được thêm vào hoặc một tham số được loại bỏ, điều này yêu cầu bảo trì trên mọi đoạn mã gọi phương thức đó. Nếu một cấu trúc đã được sử dụng, thì không ai trong số các mã gọi sẽ phá vỡ, chắc chắn? Nếu một số mã trong tương lai yêu cầu thông số bổ sung nhưng mã kế thừa không, tôi có thể thêm thông số đó vào danh sách hiện tại và mã cũ vẫn không bị lu mờ. Ví dụ: Tôi đang xem một công ty có nhiều trang web/dự án (để làm rõ từ bài đăng gốc của tôi, nói 'sản phẩm' và có thể được hiểu sai là sản phẩm thực) cần giao tiếp với cổng thanh toán . Tùy thuộc vào vị trí của khách hàng, có thể gọi tới năm cổng thanh toán khác nhau để xử lý thanh toán của khách hàng.
Hiện tại, mỗi một trong số nhiều sản phẩm này đều có triển khai xử lý thanh toán của riêng mình, hoàn chỉnh với việc kiểm tra các tham số được trả lại từ cổng. Tôi thấy điều này gây nhầm lẫn và rõ ràng là sai và mặc dù không có thời gian hoặc nguồn lực để viết lại mọi thứ từ đầu, tôi nghĩ rằng việc sửa chữa tương đối nhanh sẽ tạo ra một dự án lớp "thanh toán" mới đã được xác định thiết lập các thông số.
Theo như tôi quan tâm, giao diện người dùng chỉ nên thực hiện điều gì đó đơn giản như gọi phương thức "thanh toán x bằng tiền y trong quốc gia z" và mong đợi cờ thành công/lỗi & thư tùy chọn làm rõ bất kỳ thất bại nào. Bằng cách này, mọi sản phẩm mà công ty đều có cùng xử lý thanh toán.
Bây giờ tham số khôn ngoan, hiện tại yêu cầu đầu vào chỉ là số tiền, tiền tệ & quốc gia (không, bạn không thể suy ra tiền tệ dựa trên vị trí của khách hàng trước khi ai đó gợi ý!). Và cho một sự trở lại nó sẽ chỉ là một thành công Boolean/thất bại và một thông điệp giải thích lý do thất bại. Tuy nhiên nó có thể là thông số bổ sung này sẽ được yêu cầu - cả trong và ngoài - trong tương lai và không muốn phá vỡ các cuộc gọi hiện có để phương pháp này, nó sẽ xuất hiện hợp lý để chỉ cần sử dụng một cấu trúc đơn giản, ví dụ:
struct inParams
{
public decimal amount;
public string currency;
public string country;
};
struct outParams
{
public bool success;
public string message;
};
public outParams makePayment(inParams ip)
{
//...code goes here
}
Đây có phải là "Thing Bad" để làm mã khôn ngoan hoặc là nó chấp nhận được thực hành? Nếu bất cứ ai nghĩ rằng tốt hơn là có các tham số được định nghĩa trong chữ ký phương thức riêng lẻ, bạn có thể giải thích tại sao điều đó sẽ tốt hơn đề xuất của tôi để sử dụng cấu trúc đơn giản không?
Để đối phó với "oɔɯǝɹ"
Tôi không thực sự thấy rằng những vấn đề mà bạn đã nêu ra là có nghiêm trọng mặc dù.
Ví dụ một cuộc gọi mẫu sẽ là một cái gì đó như:
PaymentProcessor pp = new PaymentProcessor();
ppInParams ppIn = new ppInParams();
ppIn.amount = 100;
ppIn.currency = "USD";
ppIn.country = "USA";
ppOutParams ppOut = pp.makePayment(ppIn);
if (!ppOut.success)
{
//check error message, handle error, display message
}
else
{
//display confirmation message to user, update account log
}
điểm của bạn: This leads to not very discoverable code
là khó để biện minh khi đối mặt với sự đơn giản như trình bày ở trên, chắc chắn?
Users need to add extra boiler plate code just to instantiate your parameter struct.
- vâng, vâng, nhưng không phải là một cơn đau đầu lớn để thêm một dòng mã cho mỗi thông số, phải không?
You will need to manage heaps of parameter structs. Two for every method. -How are you even going to name them? -In case you're thinming, I know, I'll just reuse them, then you've made your problem worse. Whats gonna happen when a single method using a struct need another parameter?
Tôi cũng không thấy vấn đề ở đây. Tôi có một lớp "paymentProcessor" duy nhất, trong đó tôi có "ppInParams" và "ppOutParams" và chúng được chứa trong chính lớp - với tôi, một nơi hoàn toàn hợp lý để đặt chúng khi chúng liên quan trực tiếp đến lớp đó.
Điểm cuối cùng của bạn: And in particular, your return type struct smells funny to me. Do you expect that every caller will inspect the boolean result? And what should i do with the message? Log it? show it? Have you not heard of structured exception handling?
dường như kỳ quái với tôi và tôi không hiểu điểm bạn đang cố gắng thực hiện. Một triệu phần trăm CÓ Tôi mong đợi mọi người gọi để kiểm tra phản ứng boolean vì đó là những gì nói với họ nếu thanh toán là một thành công hay không! Đây là toàn bộ điểm đơn giản hóa cuộc gọi như thế này chắc chắn? Khi xử lý lỗi khác nhau tùy thuộc vào trang web nào đã gọi phương thức "thanh toán", thì một lần nữa, nó có ý nghĩa hoàn hảo với tôi để xử lý lỗi trong mã gọi.
Điều gì về khách hàng đang sử dụng nhiều nguồn thanh toán cho một đơn hàng/sản phẩm? Đây là vấn đề thường gặp khi thanh toán đến từ nhiều tài khoản. – StarPilot
@StarPilot - điều đó không xảy ra trong trường hợp này. Những khách hàng này sẽ thanh toán một lần cho số dư tài khoản/đăng ký của họ. – TheMook
@ TheMook Bạn có thể không đồng ý với tôi (và bạn không phải làm thế!), Tuy nhiên, tôi có cảm giác rằng không có câu trả lời hợp lệ nào sẽ khiến bạn thay đổi ý định ở đây. Tại sao bạn thậm chí còn hỏi câu hỏi này? –