根據我的經驗,由於Fortran命名模塊,名稱空間不足以及不區分大小寫等原因,OO Fortran中的命名問題比其他語言(例如C++)出現更多。不區分大小寫會受到傷害,因爲如果您指定Foo
類型,則不能使用名爲foo
的變量,否則會出現編譯器錯誤(使用gfortran 4.9進行測試)。
我已經解決的規則是:
- 每個Fortran語言模塊提供了一個名爲
Namespace_Foo
單一,初級班。
- 類
Namespace_Foo
可以位於您的源代碼樹中作爲Namespace/Foo_M.f90
。
- 類變量是帶有描述性小寫名詞的名詞,如
bar
或bar_baz
。
- 類方法是具有描述性(但儘可能短)名稱的動詞並使用重命名
search => Namespace_Foo_search
。
- 當沒有簡單的選擇時,類
Namespace_Foo
的實例可以命名爲foo
(不帶名稱空間)。
這些規則使它特別容易以鏡像C/C++類Namespace::Foo
用Fortran或綁定(使用BIND(C)
)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
。在大型/不熟悉的項目中,您將花費大量時間在源代碼樹中搜索特定模塊所在的位置,並且在模塊名稱和文件路徑之間制定一個約定可以成爲主要的節省時間。
我更喜歡變量的描述性名稱。後來你會忘記一個簡短名字的含義。如果在嵌套名稱的'%'的任一側使用空格,我認爲可讀性會提高。我見過這個建議。 –