2013-10-17 14 views
17

Tôi đã sử dụng Delphi trong một thời gian, nhưng thay vì đến từ nền tảng CS, tôi đã học được "về công việc" - chủ yếu là từ Boss của tôi, và được tăng cường bởi các bit và phần được chọn từ web, hướng dẫn người dùng , ví dụ, vvTại sao chúng ta nên sử dụng các lớp học thay vì hồ sơ, hoặc ngược lại?

Bây giờ ông chủ của tôi là trường cũ, bắt đầu lập trình bằng Pascal và không nhất thiết phải cập nhật những thay đổi mới nhất cho Delphi.

Gần đây tôi đã tự hỏi liệu một trong các kỹ thuật cốt lõi của chúng tôi có "sai" hay không.

Hầu hết giao diện ứng dụng của chúng tôi với MySQL. Nói chung chúng ta sẽ tạo ra một record với một cấu trúc để lưu trữ dữ liệu đọc từ DB, và các bản ghi này sẽ được lưu trữ trong một TList. Nói chung, chúng tôi sẽ có một đơn vị xác định các bản ghi khác nhau mà chúng tôi có trong một ứng dụng, và các chức năng và thủ tục mà hạt giống và đọc các hồ sơ. Chúng tôi không sử dụng thủ tục kỷ lục như nêu here

Sau khi xem xét một số ví dụ tôi đã bắt đầu tự hỏi liệu chúng tôi có nên sử dụng classes chứ không phải hồ sơ, nhưng tôi đang gặp khó khăn trong việc tìm kiếm sự hướng dẫn mạnh mẽ trong hai cách .

Loại điều chúng tôi đang xử lý sẽ là Thông tin người dùng: Tên, DOB, Sự kiện, Loại sự kiện. Hoặc Thông tin thời gian biểu: Giờ, công việc, v.v ...

Trả lời

35

Sự khác biệt lớn là các bản ghi là loại giá trị và các lớp là loại tham chiếu. Tóm lại, điều này có nghĩa là:

  1. Đối với loại giá trị, khi bạn sử dụng chuyển nhượng, a := b, một bản sao được thực hiện. Có hai trường hợp riêng biệt, ab.
  2. Đối với loại tham chiếu, khi bạn sử dụng gán, a := b, cả hai biến đều tham chiếu đến cùng một trường hợp. Chỉ có một ví dụ.

Hậu quả chính của việc này là những gì xảy ra khi bạn viết a.Field := 42. Đối với bản ghi, loại giá trị, nhiệm vụ a.Field thay đổi giá trị của thành viên theo số a, nhưng không thay đổi trong b. Đó là vì ab là các trường hợp khác nhau. Nhưng đối với một lớp học, vì ab cả hai đều tham chiếu đến cùng một trường hợp, sau khi thực hiện a.Field := 42, bạn được an toàn để khẳng định rằng b.Field = 42.

Không có quy tắc cứng và nhanh nào cho biết bạn nên luôn sử dụng các loại giá trị hoặc luôn sử dụng các loại tham chiếu. Cả hai đều có vị trí của họ. Trong một số trường hợp, sẽ thích hợp hơn khi sử dụng, và trong các trường hợp khác, sẽ ưu tiên sử dụng cái kia. Về cơ bản, quyết định luôn đi đến quyết định về điều bạn muốn người vận hành chuyển nhượng có ý nghĩa.

Bạn có một cơ sở mã hiện có và có lẽ là các lập trình viên quen thuộc với nó, đã có những lựa chọn cụ thể. Trừ khi bạn có lý do thuyết phục để chuyển sang sử dụng các loại tài liệu tham khảo, việc thay đổi gần như chắc chắn sẽ dẫn đến lỗi. Và các lỗi trong cả mã hiện có (chuyển sang kiểu tham chiếu thay đổi ý nghĩa của toán tử gán) và mã bạn viết trong tương lai (bạn và đồng nghiệp của bạn đã phát triển trực giác theo ý nghĩa của toán tử gán trong ngữ cảnh cụ thể, và trực giác đó sẽ phá vỡ nếu bạn chuyển đổi).

Hơn nữa, bạn tuyên bố rằng loại của bạn không sử dụng các phương pháp. Một loại chỉ bao gồm dữ liệu và không có phương thức nào được liên kết với nó rất có thể được thể hiện tốt nhất theo loại giá trị. Tôi không thể nói điều đó chắc chắn, nhưng bản năng của tôi cho tôi biết rằng các nhà phát triển ban đầu đã lựa chọn đúng.

+0

+1 Hoàn toàn trái ngược với bản năng đầu tiên của tôi nhưng rất thực dụng nên cuối cùng, tôi phải đồng ý. OP nên được nhận thức mặc dù có thể đạt được hiệu suất do các bài tập. Ví dụ: Việc truyền tham số bản ghi dưới dạng 'const' phải là mặc định nhưng sau đó lại có thể phá vỡ ứng dụng và chúng tôi quay lại cố gắng thực dụng . –

+0

@LievenKeersmaekers Vâng, tôi đã nghĩ đến việc thảo luận về tham số đi qua, nhưng đã chọn không đơn giản. Bạn có thể nghĩ rằng tham số truyền theo giá trị tương đương với gán. Tham số là biến cục bộ. Đi qua giá trị sao chép giá trị hoặc tham chiếu tùy thuộc vào loại tham số. Vì vậy, những gì bạn biết cho các bài tập áp dụng như nhau bằng cách tham số giá trị đi qua. –

+0

Chúng tôi thường chỉ sử dụng hồ sơ khi phát trực tuyến dữ liệu có cấu trúc (ví dụ: TCP, nối tiếp hoặc đĩa), trong trường hợp này chúng tôi sử dụng hồ sơ được đóng gói để đảm bảo kích thước vẫn còn hữu hạn. Chúng tôi sẽ sử dụng các lớp/đối tượng cho mọi thứ khác. –

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