面向对象编程(OOP)和函数式编程(FP)的思考

本文讨论了JavaScript类设计中的一种常见做法——将方法内的局部变量提升为类字段,并分析了这种做法可能带来的问题。作者建议限制变量作用域,避免不必要的状态信息,以提高代码的可读性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近看过不少 JavaScript 的类(实际是嵌套 function),自己也写了一些,发现一个值得思考的问题。

有的作者可能为了提高一点性能,喜欢有事没事把方法里面的某个变量做成类的字段(attribute)。而实际上,这些变量往往作用域在单个方法内一样工作的很好,就是说从逻辑上讲,是不需要在几个方法之间分享这些变量的。比如:

function SomeClass(){
    
var a;
    
var b;
    
function Foo(){
        a 
= 3;
        b 
= 4;
        
// 
    }
    
function Bar(){
        a 
= 5;
        b 
= 6;
        
//
    }
}

这样做我认为带来的后果就是增加了不必要的状态信息,如果类似于 Foo, Bar 这样的方法一多起来,则会增加无意中修改字段信息(破坏状态)导致出错的可能性。我阅读这样的代码的时候是很担心的。我宁愿写成这样:

function SomeClass(){
    
function Foo(){
        
var a = 3;
        
var b = 4;
        
// 
    }
    
function Bar(){
        
var a = 5;
        
var b = 6;
        
//
    }
}

函数式编程(FP)中一个思想是,函数调用应该没有“副作用”,就是不能依赖于状态,也没法修改状态。这样做的一个好处是每个函数都很容易理解,可读性好。而我们平时用面向对象编程(OOP)用多了,会有一个感觉,有时候看别人的代码真的很不容易理解,特别在没有注释的情况下。经过了重构等技术处理后,一个核心方法你看下去,其中的真实执行步骤可能会分散到无数个分支,其中又有若干对对象状态的依赖,和方法之间的协作等复杂关系,这就导致程序很难理解。

这么说的目的倒不是否定 OOP, 追捧 FP. 我是觉得可以用这个思想来指导一点我们对类的设计方法。若非必要,不要往类里面塞太多本不该属于它的字段,在不违背 DRY 原则的前提下,尽量限制变量的作用域到一个比较小的范围。这样也许能写出更易理解的程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值