2013-04-12 83 views
3

我想通過使用OOP來優化Fortran代碼的可讀性。 因此我使用派生類型。命名類型和派生類型的最佳做法是什麼?在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個或更多字母,則再次可讀性似乎是一個問題。

非常歡迎來自專家的意見。

+1

我更喜歡變量的描述性名稱。後來你會忘記一個簡短名字的含義。如果在嵌套名稱的'%'的任一側使用空格,我認爲可讀性會提高。我見過這個建議。 –

回答

4

這對Fortran沒什麼特別的。您可以使用其他語言的編碼建議。 通常,類型名稱不是由任何前綴或後綴指定的。在許多語言中,類名以大寫字母開頭。即使它不區分大小寫,也可以在Fortran中使用它。只要確保不要重複使用帶有小寫字母的名稱作爲變量名稱。

一個很好的編碼指南的例子是this,您可以非常容易地將它用於Fortran。另外,看看一些Fortran示例,例如MRCRXXOS也可能有用。

如果字母與寫入的公式不同,我會建議不要使用太短的組件名稱。在那種情況下,它可以被使用。

使用associate構造函數或指針將別名設置爲嵌套名稱,如country%hospital%service%patient%name

2

根據我的經驗,由於Fortran命名模塊,名稱空間不足以及不區分大小寫等原因,OO Fortran中的命名問題比其他語言(例如C++)出現更多。不區分大小寫會受到傷害,因爲如果您指定Foo類型,則不能使用名爲foo的變量,否則會出現編譯器錯誤(使用gfortran 4.9進行測試)。

我已經解決的規則是:

  • 每個Fortran語言模塊提供了一個名爲Namespace_Foo單一,初級班。
  • Namespace_Foo可以位於您的源代碼樹中作爲Namespace/Foo_M.f90
  • 類變量是帶有描述性小寫名詞的名詞,如barbar_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。在大型/不熟悉的項目中,您將花費大量時間在源代碼樹中搜索特定模塊所在的位置,並且在模塊名稱和文件路徑之間制定一個約定可以成爲主要的節省時間。