Ich habe eine Frage in Bezug auf Best Practices der Modell/Variablenverwendung:Wie kann man geerbte Variablen in Fortran verwenden?
Nehmen wir an, ich habe ein Modul mit einigen Variablen/Parameterdefinitionen und einige Unterprogramme, die diese Variablen verwenden.
Ich brauche diese Variablen nicht explizit in den Subroutinen zu verwenden, da sie vom übergeordneten Modul geerbt werden - aber wäre es besser, dies zu tun?
Beispiel:
module test
implicit none
integer, parameter :: a = 1
real :: x
contains
subroutine idk(y,z)
real, intent(in) :: y
real, intent(out) :: z
if(a .eq. 1) then
z = x*y + 5.
else
z = x*y - 5.
end if
end subroutine idk
end module test
Das obige Beispiel gut funktionieren soll, aber es wäre besser,
use test, only: a,x
zu Deklarationsteil Unterprogramm hinzufügen idk
?
In meiner Argumentation, gibt es zwei Hauptpunkte hier:
1) Pro: Explizit diese Zeile hinzufügen lassen ist leicht ich sehen, welche Variablen in dem Unterprogramm tatsächlich benötigt wird. In vielen Fällen enthält das Modul eine ganze Reihe von Variablen, aber nur wenige werden in jeder Subroutine benötigt. Aus Gründen der besseren Verständlichkeit wäre es daher sinnvoll, diese Zeile hinzuzufügen.
ABER
2) Contra: In ganz wenigen Fällen muss man eine Menge der Variablen/Parameter oben angegebenen (manchmal mehr als 100 Parameter Nummerierung). Explizit mit diesen am Anfang der Subroutine zu verwenden, macht den Code unnötig unnötig, wodurch die Lesbarkeit des Codes verringert wird.
Punkt 1 ist wichtig, wenn nur ein paar Variablen enthalten sein müssen, während Punkt 2 nur wichtig ist, wenn viele Variablen enthalten sein müssen. Aber ich denke, es wäre albern, eine Sache für wenige Variablen und eine andere für viele zu tun - sobald Sie eine Konvention gewählt haben, sollten Sie sich daran halten IMHO ...
Gibt es eine Best Practice in Bezug auf diese?
Zusatz: Alternativ könnte man das Unterprogramm als
subroutine idk(b,w,y,z)
erklären und dann als idk(a,x,y,z)
nennen.
Auf der einen Seite würde dies mir mehr Flexibilität geben, wenn ich später entscheiden würde, dass ich idk
mit anderen Variablen verwenden möchte.
Auf der anderen Seite ist es auch das Risiko von Fehlern erhöht, wenn ich etwas später ändern (sagen wir, ich merke, ich brauche nicht Parameter a
als Bedingung aber Parameter c
. In den ersten Fällen schalte ich aus einfach a
->c
im Unterprogramm Aber im letzten Fall, ich brauche jeden Anruf zu idk(c,...)
ändern, wenn es einer Menge dieser Anrufe ist, dies ist anfällig für Fehler)
ich würde wirklich zu schätzen Sie Ihre Eingabe..! Vielen Dank!
BTW siehe https://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts und https://meta.stackexchange.com/questions/141747/i-say-thank-you-and-es-bekommt-edited-out –
eine andere Alternative wäre, die Parameter in ein separates Modul zu setzen. – agentp
Ich nähere mich immer sehr vorsichtig der Host-Assoziation und dokumentiere das Ganze im Quellcode. Beachten Sie, dass selbst dann, wenn Sie sich entscheiden, die notwendigen Variablen als Argumente an eine interne Prozedur zu übergeben, die Hostvariablen immer noch "versehentlich" aufgerufen/geändert werden können. Ich denke, das ist schlimmer als vergessen, Variablen an eine externe Subroutine zu übergeben, denn in diesem Fall würden Sie den Fehler sofort sehen. –