微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Bean 是 Last Monoids 的产物还是我遗漏了什么?

如何解决Bean 是 Last Monoids 的产物还是我遗漏了什么?

Java 有诸如“POJO”和“Bean”之类的奇怪词汇,听到我没有合适的魔豆来种植某种程序 beanstalk,这让我感到很奇怪,但我们来了。

相比之下,我发现 Haskell 的 data 声明非常简单。

我想出了一个 bean 的心智模型,我想知道它是否太简单 - 是否有什么东西没有捕获,或者是否有比这更严格的东西。这是为了将其与 Haskell 的 Last monoid 结合其产品类型进行比较,从而使 bean 像

@Data
@NoArgsConstructor
class ClientContact implements Serializable {
  private Long clientId;
  private String displayName;
  private String emailAddress;
  private String notes;
}

可能只是像幺半群一样,

data ClientContact = 
  ClientContact { clientId :: Last Integer,displayName :: Last Name,emailAddress :: Last Email,notes :: Last Notes
                } deriving (Eq,Read,Show)

-- why can't we derive Monoid? sigh...
instance Semigroup ClientContact where
  ClientContact a b c d  <> ClientContact a' b' c' d' =
      ClientContact (a <> a') (b <> b') (c <> c') (d <> d')

instance Monoid ClientContact where
  mempty = ClientContact mempty mempty mempty mempty

这“看起来像”我看到的 Java 代码类型,例如

-- maybe some of the setters/getters are more common in the codebase
instance HasClientId ClientContact where
  getClientId = clientId
  setClientId cid = mempty {clientId = Last(Just cid)}

-- maybe some have some extra functionality on them?
setdisplayName name = mempty {displayName = trim name}

-- but the point is,~= return myContact.setClientId(123).setdisplayName("CR Drost")
return $ myContact <> setClientId 123 <> setdisplayName "CR Drost"

-- Or,~= BeanUtils.copyProperties(postData,dbContact,"clientId","emailAddress")
let newContact = dbContact <> postData{clientId = mempty,emailAddress = mempty}

这就是bean要捕获的东西吗?关于“我将有一个解析器需要初始化一个空的 ClientContact 然后慢慢地向它添加参数,我想确保这些东西有一种基本的代数,我愿意让一切都可以为空,以确保可能会发生”左右?

或者 bean 是否也应该与任意副作用以及其他有状态或幺半群行为一起使用,而这种描述太简单了?除了“在一个集合之后,每个 get 都必须返回那个值,直到其他一些集合发生......”之外的合同是什么?例如,如果每个 setWhatever() 都有将任何内容保存到数据库的副作用,那么它仍然是 Bean 吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。