簡體   English   中英

Java - 這是一個糟糕的設計模式嗎?

[英]Java - Is this a bad design pattern?

在我們的應用程序中,我看到過這樣的代碼:

User.java(用戶實體)

public class User
{
  protected String firstName;
  protected String lastName;

 ...
   getters/setters (regular POJO)
}

UserSearchCommand
{
   protected List<User> users;
   protected int currentPage;
   protected int sortColumnIndex;
   protected SortOder sortOrder;

   // the current user we're editing, if at all
   protected User user;

   public String getFirstName()
   {return(user.getFirstName());}

   public String getLastName()
   {return(user.getLastName());}

}

現在,根據我的經驗,這種模式或反模式對我來說很糟糕。 首先,我們將幾個問題混合在一起。 雖然它們都與用戶有關,但它與典型的POJO設計不同。 如果我們要走這條路,那么我們不應該這樣做嗎?

UserSearchCommand
{
   protected List<User> users;
   protected int currentPage;
   protected int sortColumnIndex;
   protected SortOder sortOrder;

   // the current user we're editing, if at all
   protected User user;

   public User getUser()
   {return(user);}

}

只需返回用戶對象,然后我們可以根據需要調用它上面的任何方法嗎?

由於這與典型的bean開發(JSR 303)完全不同,因此bean驗證不適用於此模型,我們必須為每個bean編寫驗證器。

有沒有其他人看到這種設計模式有什么問題,或者我只是作為開發人員挑剔?

沃爾特

在返回用戶對象時,您要讓UserSearchCommand在現有數據上寫入新信息,這可能不是人們想要允許的,因為搜索應該允許讀取數據。 此外,您所做的是讓使用UserSearchCommand的人必須知道User類中的方法/屬性/成員,這在第一個實現中並非如此。

使用接口的第三個選項怎么樣?

UserSearchCommand
{
  protected List<User> users;
  protected int currentPage;
  protected int sortColumnIndex;
  protected SortOder sortOrder;

  // the current user we're editing, if at all
  protected User user;

  public I_UserNameDetails getUser()
  {
    return((I_UserNameDetails)user);
  }
}

現在,您可以通過接口進行抽象,並防止修改用戶對象。

得墨忒耳法則提出了第一個例子。

當Sjoerd和JB生成有效點時,根據您對SearchCommand的使用,我將為第二個示例創建以下參數。 如果您在第一個示例中定義的操作不影響UserSearchCommand的行為,那么通過定義getFirstName()等,您實際上只是復制代碼,這可能導致可維護性問題,例如,如果稍后您添加一個中間用戶類的名稱? 然后,您不僅需要將其添加到用戶,還需要將其添加到UserSearchCommand中的訪問者。 如果對用戶做某事會修改搜索的行為,那么這可能是一個有效的參數,讓調用者通過搜索命令訪問用戶,但這也可以通過PropertyListeners等機制實現。

正如你所指出的那樣,第一個例子是將信息混合在一起,對我而言,從OOP的角度來看似乎是違反直覺的。 如果要限制對用戶訪問某些屬性,則可能需要更改訪問修飾符,或創建公開您認為安全的接口以及公開適當的包/受保護屬性的實現類。 除非您的UserSearchCommand是用詞不當,否則我希望它執行涉及搜索用戶的操作,然后將這些用戶作為一個單元(而不是用戶的單個屬性)提供。 這是搜索命令應該執行與搜索相關的操作,並且用戶應該包含關於用戶的信息。

當然這是一個風格問題,但我會投票給你的第二個例子。

我同意你的看法。 我已經看到了同樣的技術並且沒有看到重點:它只是意味着復制了一大堆代碼,為了什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM