代码之家  ›  专栏  ›  技术社区  ›  James White

当一个操作需要传递的不仅仅是结果时,你会选择tuple/stask/还是getContextual?

  •  3
  • James White  · 技术社区  · 16 年前

         "Controller"                     
          .   -> Outbox 
          .         -> Validator 
          .         -> Formatter 
          .         -> Sender
          .   <- 
    
                       -> Parameters, work in progress
                       <- Good, not so good, "you better sit down" news
    

    例外

    B 某种结果 <T>

    < />

    2 回复  |  直到 16 年前
        1
  •  4
  •   Ryan Michela    16 年前

    你可以用 Template Method 图案与 Strategy 图案:

    您的控制器将成为模板方法。对于电子邮件发送过程的每个步骤,您都会调用一个实现该步骤的委托/策略类。

    public class EmailSender
    {
        private iOutboxGetter outboxGetter;
        private iMsgValidator validator;
        private iMsgFormatter formatter;
        private iMsgSender    sender;
    
        //setters for each stragegy, or a constructor
        //good use for IOC container
    
        public iSendResult SendMessage(iMsgParams params)
        {
            try
            {
                var outbox = outboxGetter.getOutbox(params.outbox);
                var validationResults = validator.validate(params);
                if(validationResults.IsValid)
                {
                    var msg = formatter.formatMsg(params.message);
                    sender.send(msg);
                    return new AllGoodSendResult();
                }
                else
                {
                    return new ValidationFailedSendResult(validationResults);
                }
            } 
            catch(CatastrophicException e)
            {
               Pager.SendCriticalPage(e.message);
                return new CatistrophicFailureSendResult(e);
            }
        }
    }
    

    当代码必须偏离快乐路径时,我更喜欢使用异常。我觉得他们把逻辑和错误处理干净利落地分开了。

        2
  •  1
  •   KLE rslite    16 年前

    在这种情况下,你的控制器和每个动作之间都有直接关系。

    每个动作都可能返回一个简单的结果,或者通过适合其情况的方式发出错误信号:

    从一个动作到另一个动作的重用可以作为局部变量发生。

    示例代码(根据需要添加参数等):

        class Controller1 {
    
           private Sender sender = new SenderImpl();
    
           public void process(String text) {
             try {
               Outbox box = getOutbox();
               List<Errors> errors = validate(text);
               if (!errors.isEmpty()) {
                 ....
                 return;
               }
               String formatted = format(text);
               sender.send(formatted);
             } catch(MyException e) {
               ....
             }
           }
        }
    

    虽然在这段代码中,这些步骤被委托给了同一类的方法,但其他类的实例很容易遵循相同的结构(但仅在需要时,不要过度设计)。正如你提到的,这可以证明是可测试的。我更改了示例代码 sender .

    推荐文章