我想通过使用OOP来优化我在Fortran中的代码的可读性。 因此我使用派生类型。命名类型和派生类型的最佳做法是什么?
例如,最好是:
type a
real :: var
end type
type(a) :: mya
或始终按照type_
中的type_a
开始输入名称?我喜欢这个,但也许更好的想法可能很多。
此外,如果类型具有太多“级别”,那么使用可读性较差或名称较长的短名称会更难以阅读,这是更好的(那么为什么)。例如,在a%b%c%d%e
中,如果a,b,c,d和e是country%hospital%service%patient%name
中的8个或更多字母,那么再一次可读性似乎是一个问题。
非常欢迎专家的建议。
答案 0 :(得分:4)
这对Fortran来说并不特别。您可以对其他语言使用编码建议。 通常,类型名称不是由任何前缀或后缀指定的。在许多语言中,类名以大写字母开头。您也可以在Fortran中使用它,即使它不区分大小写。请确保不要使用小写字母作为变量名重用该名称。
良好编码指南的一个示例是this,您可以非常轻松地为Fortran进行调整。另外,请查看MRC或RXX等书籍中的一些Fortran示例。 OS也很有用。
如果字母与书面等式中使用的字母不同,我建议不要使用太短的组件名称。在这种情况下,它可以使用。
使用associate
构造或指针为嵌套名称(如country%hospital%service%patient%name
)创建别名。
答案 1 :(得分:2)
根据我的经验,OO Fortran中的命名问题比其他语言(例如C ++)更多,因为Fortran的命名模块,缺少命名空间和不区分大小写等等。不区分大小写会造成伤害,因为如果您将类型命名为Foo
,则不能使用名为foo
的变量,否则将出现编译器错误(使用gfortran 4.9进行测试)。
我已经确定的规则是:
Namespace_Foo
的主要类。Namespace_Foo
可以作为Namespace/Foo_M.f90
位于源树中。bar
或bar_baz
。search => Namespace_Foo_search
。Namespace_Foo
的实例可以命名为foo
(没有命名空间)。这些规则使得在Fortran中镜像C / C ++类Namespace::Foo
或者将C ++类绑定(使用BIND(C)
)到Fortran变得特别容易。它们还避免了我遇到的所有常见名称冲突。
这是一个工作示例(使用gfortran 4.9测试)。
module Namespace_Foo_M
implicit none
type :: Namespace_Foo
integer :: bar
real :: bar_baz
contains
procedure, pass(this) :: search => Namespace_Foo_search
end type
contains
function Namespace_Foo_search(this, offset) result(index)
class(Namespace_Foo) :: this
integer,intent(in) :: offset !input
integer :: index !return value
index = this%bar + int(this%bar_baz) + offset
end function
end module
program main
use Namespace_Foo_M !src/Namespace/Foo_M.f90
type(Namespace_Foo) :: foo
foo % bar = 1
foo % bar_baz = 7.3
print *, foo % search(3) !should print 11
end program
请注意,为了运行示例,您可以将上面的所有内容复制/粘贴到单个文件中。
最后的想法
我发现在Fortran中缺少名称空间非常令人沮丧,而破解它的唯一方法就是将它包含在名称本身中。我们有一些嵌套的“命名空间”,例如在C ++ Utils::IO::PrettyPrinter
和Fortran Utils_IO_PrettyPrinter
中。我将CamelCase用于课程的一个原因,例如PrettyPrinter
而不是Pretty_Printer
,是消除名称空间的歧义。如果名称空间大写或小写,对我来说并不重要,但在名称和文件路径中应使用相同的大小写,例如课程utils_io_PrettyPrinter
应该住在utils/io/PrettyPrinter_M.f90
。在大型/不熟悉的项目中,您将花费大量时间在源树中搜索特定模块所在的位置,并且在模块名称和文件路径之间开发约定可以节省大量时间。