-1

こんにちは、いくつかのコードをタブ化しようとしています。これが正しく行われたことを誰かが確認してください (簡単にするために一部のコードを変更しました):

begin
  if Password <> Database['Database']
    then showmessage ('Message')
    else
  if NewPassword <> Retype
    then showmessage ('Message')
    else
      begin
        if Message (yes, No, etc) =yes
          then
            begin
              List
              List
              List.post;
              showmessage ('Message')
            end
          else close;
      end;
end;
4

4 に答える 4

3

これはコーディングスタイルの質問であり、ここでは長く生き残れないかもしれません. :-) (コーディング スタイルは個人的な意見の問題であり、非常に多くの異なるスタイルがあります。) とにかく試してみます。:-)

少し違うやり方をします。IMO、これは、新しいプログラマーif..elseとの適切な組み合わせを明確に示しています。begin..end

begin
  if Password <> Database['Database'] then
    showmessage ('Message')
  else 
    if NewPassword <> Retype then
      showmessage ('Message')
    else
    begin
      if Message (yes, No, etc) = yes then
      begin
        List;
        List;
        List.post;
        showmessage ('Message');
      end
      else
        close;
    end;
end;

私自身のコードでは、少し違ったやり方をします (ただし、ほんのわずかな違いです)。を同じ行に移動しelse if passwordます (これによりインデントが 1 レベル減り、コードの流れがより明確になります。3 つの可能なオプションがあり、明確に示されている 3 つのオプションがあります ( if thiselse if thiselse this):

begin
  if Password <> Database['Database'] then    // option 1
    showmessage ('Message')
  else if NewPassword <> Retype then          // option 2
    showmessage ('Message')
  else                                        // option 3
  begin
    if Message (yes, No, etc) = yes then
    begin
      List;
      List;
      List.post;
      showmessage ('Message');
    end
    else
      close;
  end;
end;

書式設定によって違いが生じることがある他のコード領域は、2、3 だけです。オフハンドで思いつく限り、すぐに触れてみます。

ケース ステートメント:

case i of
  0: DoThingForZero;            // Only one line to execute for 0
  1: begin                      // Two things to do for 1
       DoSetupForOne;
       DoThingForOne;
     end;
  2: DoThingForTwo;
else                            // Handle anything other than 0, 1, 2
  DoThingsForOtherValues;
end;

while ステートメント:

while not Query1.Eof do
begin
  // Process each field in current record of table
  Query1.Next;  // Move to next row (easy to forget, infinite loop happens. :-)
end;

ステートメントを繰り返します:

i := 1;
repeat
  i := i + SomeFunctionResultReturningVariousValues();
until (i >  50)

ループの場合:

for i := 0 to List.Count - 1 do
begin
  ProcessItem(List[i]);
end;

for i := List.Count - 1 downto 0 do
  List[i].Delete;

for..in ループ:

for ch in SomeString do           // For each character in a string,
  WriteLn(ch, ' = ', Ord(ch));    // write the ordinal (numeric) value 
ReadLn;

試してください..最後に:

SL := TStringList.Create;        // Create object/open file/whatever (resource)
try
  // Code using resource 
finally
  SL.Free;                       // Free the resource
end;

試してみてください..例外:

try
  // Do something that might raise an exception
except
  on E: ESomeVerySpecificException do
  begin
     // Handle very specific exception 
  end;
  on E: ESomeLessSpecificException do
  begin
    // Handle less specific exception
  end;
  else
    raise;
end;

try..最後にtry..exceptで:

SL := TStringList.Create;         // Allocate resource
try
  try
    // Do something that might raise exception
  except
    // Handle exception as above
  end;
finally
  SL.Free;                       // Free resource
end;
于 2014-02-21T17:56:06.730 に答える
0

そのコードをフォーマットする方法は次のとおりです。

begin
  if Password <> Database['Database'] then
    showmessage ('Message')
  else
  if NewPassword <> Retype then
    showmessage ('Message')
  else
  begin
    if Message (yes, No, etc) =yes then
    begin
      List
      List
      List.post;
      showmessage ('Message')
    end
    else
      close;
  end;
end;

主な違いは次のとおりです。

  • thenオンになっている同じ行の最後に を保持しifます (複数の条件がある場合を除く)。
  • elseステートメントに沿ったifステートメントを維持する
于 2014-02-21T17:27:39.933 に答える
0

他の回答で述べたように、スタイルは非常に主観的なものであり、そのため客観的な回答をすることは困難です. ただし、Embarcadero のObject Pascal スタイル ガイドに従ってコードがどのように表示されるかについては、言うことができます。それが私が答えようとするものです (あなたが求めたよりも詳細に)。同じ問題が複数の場所で発生する場合は、一度だけ言及します。

begin
  if Password <> Database['Database']
    then showmessage ('Message')

ここで、 のケーシングは であるshowmessage必要があります。これは、ユニットShowMessage内のプロシージャに付けられた名前でもあります。と の間にDialogsスペースを入れないでください。ShowMessage(

次の行でのの使用thenは珍しいですが、問題ありません。その場合、インデントするのは正しいことです。

    else
  if NewPassword <> Retype

この 2 番目のステートメントは、最初のステートメントの分岐のif一部であり、それに応じてインデントする必要があります。elseifelse

    then showmessage ('Message')
    else
      begin

beginendサブステートメントは、上記の右側に 2 つのスペースである必要がありますelse

        if Message (yes, No, etc) =yes

の前にスペースがあり、その後にスペースがないという事実は、=私が以前に見たものではありませんが、これはスタイルガイドが好みを表現する状況ではないので、問題ありません.

          then
            begin
              List
              List
              List.post;
              showmessage ('Message')
            end
          else close;

これは特別な言及に値します:elseスタイル ガイドでは、ステートメントが続くと、支持されなくなったとして明示的に呼び出されますが、それでも問題ありません。

      end;
end;

言及する価値のあるもう1つのことは、インデントに2つのスペースを使用することは、スタイルガイドが使用することを正確に示していることです.

于 2014-02-21T18:15:41.700 に答える