如何解决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 举报,一经查实,本站将立刻删除。