Làm thế nào để bạn tránh sự tương đồng về tên giữa các lớp của bạn và những người bản địa? [đóng cửa]


9

Tôi vừa gặp phải một "vấn đề thú vị", mà tôi muốn ý kiến ​​của bạn về:

Tôi đang phát triển một hệ thống và vì nhiều lý do (có nghĩa là: trừu tượng, độc lập công nghệ, v.v.), chúng tôi tạo ra các loại riêng để trao đổi thông tin.

Ví dụ: nếu có một phương thức được gọi là SendEmail và được gọi bởi logic nghiệp vụ, thì nó có một tham số kiểu OurCompany.EMailMessage, một đối tượng hoàn toàn độc lập với công nghệ và chỉ chứa "dữ liệu liên quan đến kinh doanh" (cho ví dụ, không có thông tin mã hóa đầu abut).

Bên trong chức năng SendEmail, chúng tôi nhận được thông tin này từ đối tượng EMailMEssage của chúng tôi và tạo một đối tượng MailMessage (đây là đối tượng cụ thể về công nghệ) để có thể gửi qua mạng.

Như bạn đã biết, lớp của chúng tôi có một tên rất giống với lớp ngôn ngữ "bản địa". Vấn đề là: đây chính xác là những gì chúng là, email, vì vậy thật khó để tìm một tên có ý nghĩa khác cho chúng.

Bạn có vấn đề này thường xuyên? Làm thế nào để bạn quản lý nó?

Chỉnh sửa: @mgkrebbs chỉ nhận xét về việc sử dụng tên đầy đủ. Đây là cách tiếp cận hiện tại của chúng tôi, nhưng hơi quá dài dòng, IMHO. Tôi muốn một cái gì đó sạch hơn, nếu có thể.


2
Luôn luôn sử dụng trình độ có vẻ là một giải pháp khả thi, nếu hơi dài dòng. Sử dụng OurCompany.EMailMessage cho một loại và SendEmailClass.EMailMessage (hoặc bất cứ thứ gì) cho loại kia. Có một số vấn đề với việc thực hiện phương pháp này?
mgkrebbs

Vâng, tôi nghĩ về nó, nhưng nó dài dòng. Tôi muốn một cái gì đó "sạch hơn", nhưng giải pháp bạn đề xuất là giải pháp hiện tại của tôi. Tôi sẽ thêm phần này vào phần giải thích
JSBach

3
Tên đến trong một bối cảnh. Thường là một không gian tên hoặc một cái gì đó như thế. Vì vậy, nó không phải là một vấn đề.
deadalnix

+1, tôi thích câu hỏi này. Tôi đã từng hỏi câu hỏi này với một người hướng dẫn khoảng 7 năm trước và anh ấy nghĩ rằng tôi là một "...." :)
NoChance

Ngôn ngữ của bạn đang sử dụng là gì? Câu trả lời là ngôn ngữ cụ thể. Nói chung, câu trả lời là "sử dụng một không gian tên". Trong một ứng dụng Java, điều khá phổ biến là có cùng tên lớp được sử dụng bởi nửa tá thư viện.
kevin cline

Câu trả lời:


3

Đây là một vấn đề về không gian tên bạn sẽ sử dụng cho dự án của bạn.

Về cơ bản, một không gian tên là tập hợp các từ khóa được cung cấp bởi tất cả các lớp của bạn và / hoặc tất cả các lớp bạn muốn sử dụng trong dự án của bạn (bao gồm các lớp tiêu chuẩn thường được cung cấp với ngôn ngữ / trình biên dịch / IDE).

Vì một không gian tên là một tập hợp, một số quy tắc cơ bản được áp dụng để ngăn chặn việc tạo ra các cụm từ mà không có bất kỳ hành vi liên quan nào và một số ngôn ngữ như C # cũng cho phép bạn xác định không gian tên của riêng bạn như thường lệ và cũng sử dụng nó trong các lớp khác.

Đừng nhầm lẫn giữa không gian tên với từ khóa cơ bản của ngôn ngữ, chúng đều là một tập hợp các từ khóa nhưng có một sự khác biệt lớn giữa hai: bạn có thể sửa đổi một không gian tên nhưng bạn không thể sửa đổi các từ khóa cơ bản của ngôn ngữ. Tổng giữa không gian tên bạn đã sử dụng trong dự án của bạn và các từ khóa cơ bản của ngôn ngữ bạn sử dụng cung cấp cho bạn tổng số lượng từ khóa.

Chủ đề được thảo luận rất nhiều trên mạng, tôi có thể đề xuất một tìm kiếm cơ bản với cụm từ "không gian tên [ngôn ngữ của bạn]" o đại loại như thế. Tôi không trực tiếp trả lời câu hỏi của bạn đơn giản vì bạn có thể có cách tiếp cận khác nhau cho các ngôn ngữ khác nhau.


3

Đội ngũ phát triển cũ của tôi sử dụng để viết tắt các từ viết tắt của ứng dụng trong mỗi lớp tùy chỉnh. Chúng tôi đã có ví dụ lớp ABCEmail .

Tôi nghĩ rằng nó đơn giản hơn là dựa vào không gian tên nhưng cũng có thể là một giải pháp bổ sung cho việc sử dụng không gian tên.

Cuối cùng nhưng không kém phần quan trọng, vì bạn đang tạo một đối tượng mới, điều đó có nghĩa là đối tượng gốc không trả lời các nhu cầu của bạn để tên tệp Email của bạn có thể được tùy chỉnhEmail , AdvancedEmail ... vv


1
Đồng ý với điểm cuối cùng của bạn, nhưng tại sao sẽ OAEmailtốt hơn OurApplication.Email? OAEMailcó tác động đến mọi phần của phần mềm, trong khi ký hiệu không gian tên chỉ có tác động ở đó chuyển đổi xảy ra và cả hai lớp được sử dụng trong cùng một tệp nguồn.
Steven Jeuris

1
Tôi nghĩ tiền tố là một ý tưởng tốt khi ngôn ngữ của bạn không hỗ trợ không gian tên. Nhưng nếu ngôn ngữ hỗ trợ một số hình thức về không gian tên thì hãy sử dụng nó (đây là không gian tên vấn đề được thiết kế để giải quyết!). '
Martin York

@Steven Jeuris: Tên của lớp nên được chọn khi nó được tạo. Sau đó, tôi thấy đó là một thực tế xấu để thay đổi nó ... vì tất cả các tác động không cần thiết.
Amine

@Loki Astari: Tôi không biết bạn đang sử dụng IDE nào nhưng tôi thấy rằng một tên lớp khác dễ xử lý hơn khi tìm kiếm hoặc mở một lớp nhất định. Tôi thấy các dự án có một phiên bản "email" tùy chỉnh và mỗi lần tôi muốn mở tệp tôi phải duyệt qua một số không gian tên. Quan điểm của bạn vẫn còn hiệu lực Tôi đoán nó là chủ quan đối với tổ chức gói có bao nhiêu lớp tùy chỉnh sẽ được tạo.
Amine

1
@Amine: Tôi không nhận ra bạn đang thực sự tranh cãi với các không gian tên. Tôi khuyên bạn nên đọc về không gian tên một số chi tiết để thấy tất cả các lợi ích của việc sử dụng chúng: đóng gói, loại bỏ sự mơ hồ, ít dư thừa, ... Ps: Hầu hết các IDE hiện đại đều có các tính năng tìm kiếm cho phép bạn nhanh chóng tìm thấy tệp nguồn mà không cần phải duyệt qua thứ bậc. Theo nhận xét của bạn với tôi: tái cấu trúc liên tục là một phần của phát triển phần mềm. Khi bạn có thể đưa ra một tên phù hợp hơn, tác động lớn hay không, bạn nên xem xét đổi tên nó. Tuy nhiên, tốt nhất là thảo luận điều này với các đồng nghiệp trước.
Steven Jeuris

3

Ngôn ngữ của bạn đang sử dụng là gì? Câu trả lời là ngôn ngữ cụ thể. Nói chung, câu trả lời là "sử dụng không gian tên". Tôi gần như sẽ không bao giờ đọc tên loại để tránh xung đột với một số không gian tên bên ngoài.

Trong một ứng dụng Java, điều khá phổ biến là có cùng tên lớp (ví dụ "Ngày") được định nghĩa trong nửa tá không gian tên. Nếu một lớp cần sử dụng hai lớp Date riêng biệt, thì một trong các lớp Date phải có đủ điều kiện ở mọi nơi nó xuất hiện, vì Java không hỗ trợ các bí danh loại. Trong C ++ cuộc sống dễ dàng hơn; bạn chỉ có thể đổi tên một trong số chúng bằng một typedef.


Tôi đã định đăng một câu trả lời tương tự, nhưng thay vì ví dụ bí danh C ++ muốn đề cập đến chỉ thị bí danh của C # .
Steven Jeuris

@Steven: Tôi sẽ đề cập đến C # thay vì C ++, nhưng đã được vài năm kể từ khi tôi lập trình trong C #, và không chắc chắn.
kevin cline

2

Bạn có vấn đề này thường xuyên? Làm thế nào để bạn quản lý nó?

Nó thực sự phụ thuộc vào ngôn ngữ bạn sử dụng. Trong c ++ và java, vấn đề này được giải quyết bằng cách sử dụng các không gian tên. Tôi đang sử dụng c ++ và điều đó xảy ra là tôi có các lớp khác nhau có cùng tên. Đó không phải là vấn đề, vì chúng ở các không gian tên khác nhau.

Trong các ngôn ngữ khác, không có cách nào khác ngoài việc cung cấp các tên khác nhau.


Đối với máy tính, đó không phải là vấn đề, nhưng đối với nhà phát triển thì có thể, vì bạn đã có EmailMessage và MailMessage chẳng hạn.
JSBach

@Oscar Rõ ràng. Đối với máy tính có thể xyz123và nó vẫn hoạt động như nhau. Tôi không thấy cách khác sau đó đi dài dòng (bạn đã nói trong các ý kiến ​​rằng bạn đang cố gắng tránh nó).
BЈовић

2

Câu hỏi của bạn rất hay. Sẽ thế nào nếu bạn thêm tiền tố vào phương thức của mình bằng một tiền tố như U (hoặc u) hoặc cls (viết tắt của lớp)? Ví dụ như:

clsEMailMEssage hoặc uEMailMEssage

Điều này không đòi hỏi phải gõ nhiều và bạn có thể biết ngay rằng loại đó là 'của bạn'.

Chỉnh sửa - Đáp lại 2 bình luận đầu tiên:

Tôi muốn chỉ ra sự chú ý của độc giả về thực tế rằng: Không phải tất cả các ký hiệu Hungary đều được tạo ra như nhau. Chúng ta nên phân biệt giữa Hệ thống HungaryỨng dụng Hungary , tôi cho rằng đề xuất ở trên tuân theo loại Ứng dụng Hungary, không gây hại.

Tác hại liên quan đến ký hiệu Hệ thống Hungary, chẳng hạn như trong việc đặt tên ID, intID không có trong đề xuất trên.

Để biết thêm về điều này, hãy xem: Tạo mã sai Nhìn sai - Joel On Software


3
Mỗi khi có ai đó đề nghị ký hiệu của Đức, Chúa sẽ giết một con mèo con.
Konamiman

2
BIgHUmpCAmelCAsing cũng không giúp được gì.
Steven Jeuris

Ý kiến ​​trên được đánh giá cao. Xin vui lòng xem các chỉnh sửa của tôi, mặc dù tôi biết một số người trong chúng ta sẽ không thay đổi ý định, sau tất cả những ai muốn một con mèo con bị giết? :)
NoChance

Tôi đã bỏ phiếu bầu xuống bây giờ khi bạn thêm một số lý do hợp lệ. Tuy nhiên, tôi không đồng ý rằng Ứng dụng Hungary phù hợp hơn các tên trong kịch bản này. Khi ngôn ngữ hỗ trợ bí danh, đó là một giải pháp phù hợp hơn nhiều. Xem câu trả lời của kevin cline .
Steven Jeuris

@Steven Jeuris, cảm ơn bình luận của bạn. Không gian tên là hoàn hảo ngoại trừ chúng là loại dài để tiếp tục gõ, tôi sẽ kiểm tra liên kết bạn đã cung cấp.
NoChance
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.