Có phải là thực hành tốt để bọc một tập các thuộc tính có liên quan vào cấu trúc / lớp riêng của nó không?


10

Viết một đối tượng Người dùng bằng Swift, mặc dù câu hỏi của tôi liên quan đến bất kỳ ngôn ngữ được gõ mạnh nào. Người dùng có thể có một loạt các liên kết (FacebookProfile, InstagramProfile, v.v.). Một vài câu hỏi xung quanh này.

  1. Có phải là thực hành tốt để bọc liên kết trong đối tượng của họ?
    người dùng cấu trúc {
       var FirstName: chuỗi
       var lastName: chuỗi
       email var: chuỗi
       liên kết var: Liên kết
    }
    liên kết cấu trúc {
       var facebook: chuỗi
       var instagram: chuỗi
       var twitter: chuỗi 
    }

Hay họ nên thả lỏng? Tôi biết về mặt kỹ thuật cả hai cách đều tốt, nhưng tự hỏi liệu có một cách tiếp cận được đề xuất, nói chung - đặc biệt là cho khả năng đọc.

struct User { 
   var firstName: string
   var lastName: string
   var email: string
   var facebookLink: string
   var twitterLink: string
   var instagramLink: string
}
  1. Trong một kịch bản như thế này, các liên kết có nên là một bộ sưu tập / danh sách không? Tôi cho rằng nó không nên là một danh sách vì có sẵn một số tùy chọn liên kết cố định và không phải là số lượng ngày càng tăng. Là suy nghĩ của tôi phải không?

  2. Có nên thực hiện tốt các phương thức kết nối mạng của tôi bên trong đối tượng Người dùng, như getUsers, getUser, updateUser không?

Tôi biết những điều này có thể là chủ quan, nhưng tôi đang cố gắng hiểu thực tiễn tốt nhất xung quanh các tình huống tương tự là gì. Sẽ đánh giá cao bất kỳ con trỏ.

Câu trả lời:


30

Bạn sẽ cần

  • không có gì,
  • một trong những điều, hoặc
  • một con số tùy ý của sự vật.

Tôi sốc vì thiết kế của bạn dự đoán rằng số lượng liên kết cần thiết sẽ luôn là ba và bạn biết tên của họ là gì mãi mãi.

Những gì tôi đang giảng được gọi là quy tắc vô cực số một . Ban đầu nó có thể không rõ ràng nhưng điều đó cho tôi biết thiết kế của bạn không khoan dung trong tương lai.

Tôi cảm thấy khác đi nếu có điều gì đó về những liên kết đặc biệt với họ. Một số điều đặc biệt mà tôi làm khác khi truy cập vào một liên kết facebook mà tôi không làm cho một liên kết twitter. Điều đó sẽ làm cho họ những điều khác nhau. Nhưng điều đó không được chỉ ra trong mã này.

Đó là lý do tại sao tôi không bị làm phiền bởi chuỗi email. Tôi biết rằng được sử dụng theo một cách khác sau đó các liên kết.

Vì vậy, cho đến khi tôi thấy một lý do để sử dụng các liên kết này một cách khác nhau, tôi ở bên cạnh một bộ sưu tập liên kết.


4
FacebookProfile, InstagramProfile, ...Tôi nghĩ OP đã trả lời câu hỏi. Ngôn ngữ của nó đang cho chúng ta biết rằng Người dùng có thể không có hoặc một vài hồ sơ liên quan đến mạng xã hội. Nhưng lập trình viên bên trong anh ấy / cô ấy đã biến yếu tố này thành các liên kết đơn thuần. Tại sao không phải là một bộ sưu tập Profiles? Tôi đồng ý với CandiedOrange. Bạn đang giả định quá nhiều về tương lai. Mạng xã hội mới có thể xuất hiện. Những người thực tế có thể biến mất. Người dùng có thể đi và đến từ mạng này sang mạng khác.
Laiv

Đây là một phỏng đoán. Giả sử bạn muốn sử dụng các hồ sơ này để đăng nhập xã hội. Có hồ sơ thành phần, chúng tôi có nơi để bắt đầu. Nơi đóng gói thông tin liên quan đến xác thực và phiên hiện tại với các cấu hình này. Điều này có thể được coi là YAGNI hoặc kỹ thuật quá mức, nhưng không có gì đáng suy nghĩ về nó, xem liệu các tính năng này có thể được yêu cầu hoặc liệu chúng có thể cung cấp giá trị cho ứng dụng của chúng tôi hay không. Nếu không, chỉ cần loại bỏ chúng.
Laiv

1
@Prabhu phụ thuộc vào lý do tại sao bạn giới hạn nó. Tôi đoán chỉ có rất nhiều phù hợp trong GUI. Cái nào cũng được. Nhưng đừng giới hạn cấu trúc dữ liệu vì GUI. GUI thay đổi bất chợt. Cấu trúc dữ liệu là tốn kém để thay đổi. Nó thực sự trả tiền để có được chúng ngay lần đầu tiên.
candied_orange

2
Đó là điểm. Chỉ cần áp dụng những cấu trúc đó sẽ làm cho những thay đổi có thể trong tương lai ít đau đớn hơn. Không nhiều không ít. Chúng tôi, Candied và tôi nói điều này bởi vì chúng tôi (tôi tin) đã phải đối mặt với những tình huống tương tự thường xuyên và chúng tôi thấy trước các tính năng có thể dễ bị thay đổi hoặc phát triển. Cuối cùng, bạn là người gần gũi hơn với dự án và triển vọng tương lai của nó.
Laiv

1
@Prabhu: Lưu ý rằng bạn đã hỏi một câu hỏi về thực hành tốt , chứ không phải liệu đó có phải là cách tiếp cận ngắn gọn nhất cho kịch bản cụ thể của bạn hay không. Tôi thường đứng về phía tránh kỹ thuật quá mức, nhưng chi phí bảo trì trong tương lai (thêm / xóa liên kết, cập nhật định nghĩa lớp thực thể, ...) vượt xa chi phí thực hiện bộ sưu tập liên kết. Nếu bạn gọi là các cột của bạn link1, link2, link3, nhu cầu về một bộ sưu tập có thể đã được rõ ràng hơn. Tuy nhiên, việc bạn đặt cho các cột một cái tên có ý nghĩa hơn không làm thay đổi thực tế rằng đó là một tập hợp dữ liệu lặp đi lặp lại.
Flater

6

Bạn đang trên bờ vực rơi vào cái bẫy "Tôi thấy một khả năng kỹ thuật".

Chỉ vì bạn thấy một đặc điểm chung giữa các mặt hàng không có nghĩa là áp dụng một số tổng hợp trên chúng. Tập hợp nên có nghĩa là một cái gì đó. Không phải ở cấp độ kỹ thuật mà trong lĩnh vực vấn đề của bạn.

Chúng đều là các liên kết ổn, nhưng trong ngữ cảnh của một lớp người dùng, điều đó có nghĩa gì không? Không. Nó cũng vô nghĩa như đối với nhóm phụ sử dụng các lớp có tên là "chuỗi" và "số".

Những rắc rối với loại điều này là nó làm mờ mô hình của bạn. Nó buộc người đọc mã cắt đứt ý nghĩa từ vô nghĩa, trước khi có sự hiểu biết đầy đủ về tên miền.

Không ai từng nói về các liên kết của người dùng. Sẽ khác nếu bạn gọi tổng hợp SocialNetworkIds của bạn. Bởi vì điều đó thực sự có nghĩa là một cái gì đó, nó sẽ là một tài sản thực sự của Người dùng chứ không phải là một bộ sưu tập kỹ thuật tùy ý.


Chính xác những gì tôi nghi ngờ là điều đó thôi thúc tôi đặt câu hỏi này. Mối quan hệ duy nhất giữa các liên kết khác nhau là chúng có thể được hiển thị cùng nhau trong UI. Vì vậy, trong trường hợp này, bạn sẽ đề nghị KHÔNG đặt chúng vào một đối tượng riêng biệt, mà là giữ chúng trực tiếp dưới đối tượng Người dùng?
Bohhu

1
Tôi không nghĩ rằng nó sẽ hữu ích trong trường hợp này. Bạn chưa có một vấn đề nào biện minh cho việc thêm một lớp phức tạp. Nếu bạn có nhiều tài sản hơn, có thể đã đạt được một nỗ lực nhóm (với tên apt cho các nhóm). Thật khó để nói những gì phù hợp mà không có bối cảnh. Điểm mấu chốt là nó sẽ làm cho mọi thứ dễ dàng hơn. Để hiểu và / hoặc tiến hành bất cứ bước tiếp theo nào của bạn trong quá trình phát triển là.
Martin Maat

Tôi thường như tránh quá kỹ thuật, nhưng tôi tự hỏi: bạn sẽ nói điều tương tự nếu OP đã đặt tên các lĩnh vực của mình link1, link2, link3? Thiết kế cấu trúc dữ liệu độc lập với tên của các trường, vì vậy ví dụ của tôi là tương đương về chức năng. Đó là một vấn đề của tương lai. YAGNI thường áp dụng, nhưng nếu có bất cứ điều gì, phương tiện truyền thông xã hội đã chứng minh rằng nó dễ bị ảnh hưởng và sự thay đổi của virus. Tránh tái phát triển cho mọi trang web truyền thông xã hội phổ biến mới dường như là mong muốn. Nếu không, bạn có nguy cơ rơi vào "một lĩnh vực nữa?" bẫy, có thể tạo ra khoản nợ lớn.
Flater

1

Nói chung, tôi nghĩ sẽ hợp lý nếu có các liên kết riêng structnếu bạn có khả năng áp dụng các thao tác tương tự cho từng liên kết đó và đặc biệt nếu bạn luôn thực hiện các thao tác giống nhau trên tất cả chúng. Nếu chúng dành cho các mục đích không liên quan trong ứng dụng của bạn, thì tôi sẽ tách chúng ra. Ví dụ: nếu họ là trang chủ của người dùng, trang web của nhà cung cấp bảo hiểm y tế của họ và liên kết đến trang tin tức yêu thích của họ, tôi có thể sẽ không nhóm họ lại với nhau vì họ dường như không liên quan. Nhưng đối với 3 trang truyền thông xã hội, có vẻ như chúng sẽ được đối xử tương tự trong một ứng dụng và vì vậy có lẽ nên được nhóm lại với nhau. Tôi sẽ sử dụng một tên mô tả nhiều hơn Linksmặc dù. (Loại liên kết nào? Vì mục đích gì trong ứng dụng của bạn?)

Tôi đồng ý với suy nghĩ của bạn về # 2. Như đã đề cập ở trên, nếu số lượng tăng hoặc biến, một danh sách hoặc bộ sưu tập khác sẽ là một lựa chọn tốt, nhưng không phải cho kịch bản bạn đã mô tả.

Tôi sẽ không đặt các phương thức kết nối mạng bên trong các đối tượng chứa dữ liệu được truy xuất bởi mạng. Dữ liệu đến từ đâu và làm thế nào để có được nó thường không liên quan đến mục đích chính của một lớp. Điều gì xảy ra nếu trong tương lai bạn muốn lấy một số dữ liệu từ đĩa? Hoặc muốn người dùng nhập nó? Đi đủ xa trên con đường đó và một Userlớp đơn giản phải có mã để xử lý mọi phương thức nhập và truy xuất dữ liệu có thể. Chỉ cần tạo một Userlớp giữ và duy trì dữ liệu trong khi nó nằm trong bộ nhớ. Mọi thứ khác có thể được xử lý bởi các lớp thích hợp hơn.

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.