更好地选择“在哪里宣布行动?(oop)”

时间:2014-09-10 14:19:50

标签: oop

怀疑在哪里定义行动 对一个类的属性采取行动?
例如: - 帐户,我们将在其中定义帐户属性,例如帐户号,持有人姓名。
像往常一样,银行的员工(班级)可以在客户的账户上添加,更新(crud)操作。 我怀疑在哪个类中我们必须在Employee类或Account类中定义那些(crud)动作? 因为这些操作是由员工实时执行的。另一方面,Actions需要对Account属性进行操作,可以在Account类本身中定义,哪个更好? '需要对属性执行操作,在同一个类中定义更好'或者'行动是在课堂上定义的,他们(演员)的行动是否更好'

3 个答案:

答案 0 :(得分:1)

恕我直言,Employee类应该是一个简单的POJO,为了在其他组件中使用它,你应该创建一个AccountOperation服务(Java EE上下文中的EJB)

    public class AccountOperation 
   {

        Customer customer;
        Employee employee;
        public void createAnAccount(){

        }

        public void deleteAnAccount(){

        }

        public void debitAnAccount(){       
        }

    }

答案 1 :(得分:1)

在我对你描述的问题的理解中,这样的"操作"进入service layer

您可以在上面分享的链接中看到Martin Fowler将服务层描述为:

  

使用一层服务定义应用程序的边界   建立一组可用的操作并协调   应用程序在每个操作中的响应。

因此,在我对您的解决方案的看法中,员工和帐户都只是像@Rotka所说的POJO。在我看来,你的图层的界面有点像

在数据源层:

interface AccountRepository {
  Account findById(Long id);
  Account save(Account account);
}

我怀疑你可以删除一个银行帐户,但你可以把它置于不活动的状态。

比你的服务层可能有点像

interface AccountService {
   Account openAccount(Account account);
   void closeAccount(Account account);
   transferFunds(Account source, Account target);
   ...
}

你所谓的员工可能是在这里使用的错误抽象。您可能会考虑用户,例如当前允许打开帐户的用户吗?

因此,请考虑以下假设实现

class DefaultAccountService implements AccountService {

   private SecurityContext securityContext;
   private Validator validator;
   private AccountRespotiroy accountRepository;

   @Override
   public Account openAccount(Account account) {
     if(!securityContext.getUser().hasPermission("openAccount")){
        throw new UnAuthorizedException("You cannot open accounts");
     }
     Set<ConstraintViolation> violations = validator.validate(account);
     if(violations.size() > 0){
        throw new BadRequestException("Invalid account", violations);
     }
     return accountRepository.save(account);
   }

  ...
}

答案 2 :(得分:-1)

创建和删除帐户 - 创建帐户实例,然后传递&#34; whodunnit&#34;作为员工 - 或完成某事时的某些相关标识符:

Account Account = new Account(Customer, AccountNumber);
Account.createAccount(Employee).
Account.deleteAccount(Employee).

对于交易,您需要两个帐户 - 信用卡和借记卡帐户。由于事务跨越多个帐户,因此以下方法必须位于其自己的类中:

public void AccountTransaction(Account CreditAccount, 
                               Account DebitAccount, 
                               float TransactionAmount.
                               Employee Employee){

   CreditAccount.creditAccount(TransactionAmount, Employee);
   DebitAccount.debitAccount(TransactionAmount, Employee);
   }

很可能这种方法会被许多&#34;交易类型调用&#34; (贷款,利息支付,汇款等)