# コーディング上の注意事項(案) ## 関数の定義で、文字列(String)を引数とするときは原則としてconstかvarで修飾する。 - FixInsight O801 - const修飾すると、関数内部で参照カウントを増減する処理と、これを確実に行うための暗黙のtry..finallyブロックの生成が行われなくなる。そのかわりに関数内で仮引数の内容を変更することはできない。 - var修飾すると、文字列変数(文字列領域へのポインタ)のアドレスそのものが引き渡され、参照カウントに影響を与えない。関数内で仮引数の内容を変更すると、呼び出し元にもその変更が反映される。 - 引き渡された文字列を関数内部で変更しないのであればconstで、変更した結果を呼び出し元に反映するのであればvarで修飾する。 - 一時変数に受け渡した後で関数内部でだけ変更する、というコーディングのかわりであれば、例外的にconst/var修飾しなくてもよい。 ## 関数の定義で、配列パラメータ(array of ... または TArray<>)を引数とするときは原則としてconstかvarで修飾する。 - 文字列の場合と同様。 ## 関数の定義で、レコード型を引数とするときは原則としてconstかvarで修飾する。 - const/var修飾がないと、呼び出された関数の冒頭で渡されたレコードの実体をコピーする処理が行われる。 - const修飾すると、レコード型がCPUレジスタに格納できるサイズ(引数全体で12バイト?)であればレジスタに直接格納され、それを超えたらレコードのアドレスが渡される。関数内で仮引数の内容を変更することはできない。 - var修飾すると、レコードのアドレスが渡される。関数内で仮引数の内容を変更すると、呼び出し元にもその変更が反映される。 ## try..finallyブロックの内側でクラスのインスタンスを生成するときは、tryの直前でクラス変数をnilでクリアする。 - FixInsight W511 - クラス変数を初期化しないままtryブロックに入り、インスタンスを生成してクラス変数に格納する前にブロックを(raiseやExitで)抜け出すと、finallyで未初期化のクラス変数でFree/FreeAndNilを呼び出すことになり、エラーの原因となる。 ## インタフェース型の変数はFree、FreeAndNilで解放しない。 - FixInsight W531 - Delphi 10.3.xおよびそれ以前ではFreeおよびFreeAndNilはクラス型ではない変数でもコンパイルエラーにはならないが、実行時にVMTの参照でアクセス違反になる。 - Delphi 10.4以降ではFreeおよびFreeAndNilのシグネチャが変更されているためコンパイルエラーとなる。 - インタフェース型なので単純にnilを代入すればよい。 ## クラスのコンストラクタ、デストラクタの実装では原則としてinheritedで継承元コンストラクタ、デストラクタを呼び出す。 - FixInsight W525, W504 - 継承元コンストラクタを呼び出さないと継承元で行うべき処理(フィールドの初期化など)が適切に行われない可能性がある。 - 継承元デストラクタを呼び出さないと継承元で行うべき処理(所有しているオブジェクトの解放など)が適切に行われない可能性がある。 - 継承元コンストラクタ呼び出しのinheritedはコンストラクタの最初に記述することが望ましい。 - 継承元デストラクタの呼び出しのinheritedはデストラクタの最後に記述することが望ましい。 ## デストラクタは必ずoverrideディレクティブを指定する。 - FixInsight W522 - Delphiでは基底クラス(TObject)の(仮想)デストラクタをオーバライドしないでreintroduceすることを想定していない。 ## 例外を送出するコードの後には処理を記述しない。 - FixInsight W509 - raise、Exception.RaiseOuterExceptionなどの例外を送出するコードの後は絶対に実行されない。 ## インライン指定した関数は、同一ユニット内でその関数を呼び出している位置よりも前で定義する。 - FixInsight O805 - inlineディレクティブを指定してもインライン展開されない条件の中に『使用される前に定義されていないルーチンは、インライン化されません。』がある。(http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E6%89%8B%E7%B6%9A%E3%81%8D%E3%81%A8%E9%96%A2%E6%95%B0%E3%81%AE%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%EF%BC%88Delphi%EF%BC%89#inline_.E6.8C.87.E4.BB.A4.E3.81.AE.E5.88.A9.E7.94.A8)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up