相关疑难解决方法(0)

功能编程是否取代了GoF设计模式?

自从我去年开始学习F#和OCaml以来,我已经阅读了大量的文章,这些文章坚持认为设计模式(特别是Java)是命令式语言中缺少的功能的变通方法.我发现的一篇文章提出了相当强烈的主张:

我遇到过的大多数人都读过Gang of Four的"设计模式"一书.任何自尊的程序员都会告诉你,这本书与语言无关,而且无论你使用哪种语言,这些模式都适用于软件工程.这是一个崇高的主张.不幸的是,它与事实相去甚远.

功能语言极具表现力.在函数式语言中,人们不需要设计模式,因为语言可能是如此高级,您最终会编写概念,一起消除设计模式.

函数式编程的主要特性包括作为一等值,currying,不可变值等的函数.对我来说,OO设计模式近似于任何这些特性似乎并不明显.

另外,在支持OOP的函数式语言(例如F#和OCaml)中,对我来说很明显,使用这些语言的程序员将使用与其他OOP语言相同的设计模式.事实上,现在我每天都使用F#和OCaml,我在这些语言中使用的模式与我在Java中编写时使用的模式之间没有明显的差异.

功能编程是否消除了对OOP设计模式的需求,是否有任何理由?如果是这样,您是否可以发布或链接到典型OOP设计模式及其功能等效的示例?

oop design-patterns functional-programming

1028
推荐指数
16
解决办法
10万
查看次数

多态性与策略模式

Strategy模式和PolymorphismJava 之间有什么区别?

我很困惑,通过策略模式实现的任何事情基本上都可以通过多态实现.如果我在这方面错了,请纠正我.

请给我一个根除我的困惑的例子.

java polymorphism design-patterns strategy-pattern

40
推荐指数
5
解决办法
8944
查看次数

用多态替换开关盒

我知道已经有类似的问题,但是看着它们,我仍然对应该如何设计代码有一些疑问。我有一项允许User 注册/登录/更新/删除的服务。事实是,它User是一种抽象类型,其中包含应typeOfUser基于其调用实际注册/更新/删除方法的数据,现在我在一个switch-case块中进行操作。我想用一些更好的设计代替它。

UserController.java

public class UserController {

    public UserDto register(UserDto user) {
        switch(user.getTypeOfUser()) {
        case DRIVER: return driverService.register(user);
        case CUSTOMER: return customerService.register(user);
        // ...
        }
    } 

    public UserDto update(UserDto user) {
        switch(user.getTypeOfUser) {
        case DRIVER: return driverService.update((DriverDto) user);
        case CUSTOMER: return customerService.update((CustomerDto) user);
        // ...
        }
    }

    public UserDto login(long userId) {
        loginService.login(userId);

        UserBO user = userService.readById(userId);

        switch(user.getTypeOfUser) {
        case DRIVER: return DriverDto.fromBO((DriverBO) user);
        case CUSTOMER: return CustomerDto.fromBO((CustomerBO) user);
        // …
Run Code Online (Sandbox Code Playgroud)

java polymorphism design-patterns visitor

5
推荐指数
2
解决办法
3757
查看次数