2010-06-13 28 views
5

Người dùng Stackoverflow: Rất nhiều thứ có thể được thể hiện trong chương trình bằng cách sử dụng các loại cơ bản, hoặc chúng tôi có thể tạo một lớp mới cho chương trình đó.Khi nào nên sử dụng các loại cơ bản (Số nguyên, Chuỗi) và khi nào cần viết một lớp mới?

Ví dụ: Số an sinh xã hội có thể là số, chuỗi hoặc đối tượng riêng của nó.

(ví dụ phổ biến khác: Số điện thoại, tên, mã zip, dùng id, trật tự id và khác của id.)

Câu hỏi của tôi là: Khi các loại cơ bản nên được sử dụng, và khi chúng ta nên viết mình một lớp mới?

Tôi thấy rằng khi bạn cần phải thêm hành vi, bạn sẽ muốn tạo ra một lớp (ví dụ, số an sinh xã hội phân tích, xác nhận, định dạng, vv). Nhưng đây có phải là tiêu chí duy nhất không?

Tôi đã gặp các trường hợp có nhiều thứ trong số này được biểu diễn dưới dạng số nguyên và/hoặc chuỗi java. Chúng tôi mất lợi ích của việc kiểm tra loại và tôi thường thấy các lỗi do các tham số được trộn lẫn trong các cuộc gọi đến function(Intever, Integer, Integer, Integer).

Chúng ta không thể hưởng lợi từ việc có function(OrderId, ExternalOrderId, UserId, SalesManId) và không được hưởng lợi từ việc kiểm tra loại, mặc dù không ai trong số này một mình biện minh có lớp riêng của mình?

Rõ ràng, câu trả lời là "nó phụ thuộc". Nhưng, bạn nghĩ gì và bạn thường làm gì?

+1

Đây là câu hỏi về ý tưởng về * Cách * thay thế nguyên thủy bằng các lớp nếu/khi bạn quyết định bạn muốn: http://stackoverflow.com/questions/24981278/design-patterns-for-type-safe-integers – Morad

Trả lời

2

Câu hỏi đặt ra không phải là "Làm thế nào tôi có thể lưu trữ dữ liệu này?", Mà là "Làm thế nào để tôi có thể hành động trên dữ liệu này?".

Để sử dụng một vài ví dụ của bạn: SSN là số, ở dạng XXX-XX-XXXX. Nếu bạn đang có lẽ sẽ đọc một giá trị người dùng-đầu vào cho điều này, sau đó bạn cần phải cung cấp một số loại xác nhận để đảm bảo định dạng đã được nhập đúng cách. Bạn cũng có thể muốn cung cấp một phương thức để nhập 3 số riêng lẻ (chẳng hạn như 3 hộp văn bản trên biểu mẫu), nhưng nối chúng vào trong SSN. Sử dụng một lớp String hoặc Integer một mình sẽ không cung cấp phương tiện thực hiện các tác vụ này, vì vậy tốt hơn hết nên cung cấp cho nó một loại riêng và đảm bảo chỉ có thể lưu trữ các giá trị hợp lệ. Loại sẽ có một Int hoặc String nội bộ để thực sự giữ dữ liệu, nhưng lớp đóng gói đảm bảo rằng bạn đọc/ghi giá trị một cách hợp lệ.

Số điện thoại, Mã zip là các khu vực khác mà bạn có thể muốn xác thực, do đó bạn nên sử dụng chúng ở đó.

UserIds sẽ phụ thuộc vào kịch bản, nhưng loại nguyên thủy thường là đủ. Nếu bạn cần phải hạn chế id người dùng vào một phạm vi số nhất định mặc dù (khác với phạm vi của bất kỳ kiểu Integer nguyên thủy nào), bạn có thể gói gọn nó vào một lớp.

2

Nếu có nhiều tài sản chung cho cùng một đối tượng thực tế đời sống, và bạn muốn có phương pháp cụ thể để thao tác với các đặc tính này, sử dụng một lớp. Nếu chỉ có một loại dữ liệu, và không cần thao tác nâng cao, hãy sử dụng nguyên thủy.

1

Miễn là các loại được tạo sẵn có ý nghĩa đối với những gì bạn đang sử dụng, vì không có lý do gì để tạo một lớp đặc biệt. Khi không rõ dữ liệu trong một biến thực sự có nghĩa là gì, bạn có thể tạo một lớp để làm cho nó rõ ràng.

Giá trị giống như số điện thoại ví dụ hoạt động tốt như một chuỗi.Đó là số trong tự nhiên, tuy nhiên bạn sẽ không thực hiện bất kỳ phép tính nào trên nó, vì vậy bất kỳ xác nhận nào bạn thực hiện trên nó không quan trọng đối với hàm, nó chỉ đơn thuần là ngăn người dùng nhập vào vô nghĩa.

Giá trị như khoảng cách là một ứng cử viên cho một lớp học. Bạn có thể sử dụng một số nguyên hoặc một đôi để lưu trữ một khoảng cách, nhưng sau đó bạn phải thêm một số thông tin để làm cho giá trị có ý nghĩa, ví dụ như đặt tên biến DistanceInMeters. Bạn có thể tạo một lớp cho khoảng cách để hạn chế sử dụng nó, chỉ cung cấp phương thức FromMeters làm hàm tạo và chỉ có các thuộc tính Mét để đọc giá trị. Bằng cách đó, rõ ràng giá trị của nó có ý nghĩa gì.

+0

Bằng cách nào đó, ví dụ của bạn dường như ngược lại với trực giác của tôi, số điện thoại phải là một lớp vì nó có thể có nhiều định dạng khác nhau và chúng tôi không muốn mọi người phải xử lý và phân tích cú pháp tay khi nói đến các biến như khoảng cách tôi không thấy cần phải biến nó thành lớp riêng của nó, tôi thường lưu ý các đơn vị trong tên của biến (ví dụ 'int commandTimeoutSec') – Morad

+0

@MoradAbdelrahman: Vâng, đó có thể là cách bạn muốn triển khai nó, nhưng điều đó không thực sự phù hợp với các ví dụ. Họ chỉ là những ví dụ để có một cái gì đó để cộng hưởng xung quanh, và đó là lý do trong các ví dụ có liên quan. – Guffa

1

Đó là sự đánh đổi. Các loại cơ bản dễ hiểu trong khi các loại tùy chỉnh phải được hiểu trước. Nó phải là một trong những thực thể chính của miền dự án của bạn được khai báo là một kiểu tùy chỉnh.

tiêu chí là: nếu nó có giá trị theo loại tùy chỉnh, đã có cụm từ tương đương với tên miền cụ thể cho nó. Ví dụ, chúng tôi gọi là "người lái xe" là "tài xế" trong lĩnh vực vận chuyển trong khi có hành khách và ... trong khi ở lĩnh vực y tế tất cả tài xế và hành khách đều là con người và tiêu chí sẽ là thứ khác.

0

Nếu trường đó luôn được sử dụng kết hợp với các trường khác, việc tạo nhóm logic hợp lý. Điều này có thể được nhìn thấy khi có các phương pháp luôn sử dụng cùng một tập các tham số.

Các trường nhóm thành các đơn vị lôgic sẽ trừu tượng hóa đơn vị lôgic chính nó từ người dùng của đơn vị logic. Điều này có nghĩa là chi tiết triển khai bị ẩn, cho phép thay đổi biểu diễn cơ bản của dữ liệu mà không ảnh hưởng đến các khu vực khác của mã.

Nếu có chức năng chỉ hoạt động trên trường đó, thì tôi coi ứng viên là một lớp. Ngoài ra, nếu đơn vị là đơn giản nhưng luôn luôn được sử dụng trong cùng một cách, tôi xem xét làm cho nó vào một lớp học và đưa chức năng đó vào lớp. Điều này có nghĩa là chức năng này chỉ được duy trì ở một nơi, vì vậy việc thay đổi hành vi đó dễ dàng hơn và mã của bạn sẽ chứa ít sự lặp lại hơn.

1

Cung cấp loại an toàn cho hàm đa đối số là trường hợp IMO thực sự đáng giá để tạo lớp không có bất kỳ chức năng nào (giả sử bạn có đủ chức năng trong mã để hưởng lợi).

Đối số được đặt tên sẽ là giải pháp dễ dàng hơn, mặc dù chúng không có sẵn ở tất cả các ngôn ngữ.

+0

Đã một thời gian kể từ khi tôi đặt câu hỏi, nhưng tôi đã đạt được khá nhiều kết luận tương tự. Loại an toàn và tránh nhầm lẫn thường rất đáng để giới thiệu một số lớp học mới (nhỏ). – andrel

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