我正在用 Fortran 90/2003 编写一个简短的模块,它提供了一个简单且用户友好的界面,用于计算程序执行的不同部分之间的时间。受 Matlab 中的tic
,tac
命令的启发,其想法是用户在程序中使用该模块,如下所示:
程序测试 使用定时器 调用 Tic("timername") !一些沉重的东西 调用 Tac("timername") 结束程序测试
现在,我知道如何使用Fortran 内在函数实现该结果。我的问题是我应该怎么做。我这样做是为了学习好的设计实践,而不是 Fortran 语法。
我已经定义了一个名为 的用户定义变量Timer
,它是我用来实现该功能的主要对象。然而,有(至少)两种不同的方式来使用这个对象让用户使用多个计时器:
a)我可以将用户定义的变量Timer
公开,然后强制用户手动创建计时器对象。用户必须根据需要创建尽可能多的计时器,然后使用方法来处理它们。
b)我可以通过将其设为私有来隐藏此类型。然后,为了存储不同的计时器,我在模块中创建了一个对象数组Timer
作为全局变量,虽然对于模块来说是私有的,并且每次用户调用子例程Tic
时,都会在这个数组中定义一个新的计时器。在上面的示例中,用户正在使用按照后一种方法实现的模块(请注意,该程序根本不使用关键字type
)。
尽管这两个选项在技术上都有效(我已经实现了),但每个选项都有优点和警告,而且我所知道的关于软件设计的规则不知何故发生了冲突。从“正统”的角度来看,我想知道哪种方法最好。
选项 a) 具有更好地遵循 OOP 的优点:用户显式创建对象并使用它进行操作。它不使用任何全局变量。
选项 b) 的优点是被更强烈地“封装”。我的意思是用户甚至不需要知道 aTimer
是什么,甚至不需要知道它的存在。此外,提供的与Timer
对象交互的接口只是一个简单的字符串,使得整个模块对用户来说更加不透明,不需要特意定义Timer
变量。他/她只使用模块提供的两个接受字符串作为输入的子例程。就这样。问题是我觉得这种基于为整个模块定义的数组的设计违背了避免全局变量的规则。它不是真正的全局变量,因为它是私有的,但仍然如此。
那么有这两种选择,我应该选择哪一种来产生最正统的方法?
PS:也许还有第三种选择,它允许用户间接创建对象,而无需访问用户定义的类型(即不仅仅是在现有数组中定义元素,就像在解决方案 b 中所做的那样)。我不知道这是否可以在运行时创建变量。在这个方向上的任何想法也非常受欢迎。