プログラムの魂

映画「I'm a Robot」の冒頭を覚えていますか? そこで、教授はプログラムコードで「魂」の現象について講義します。



「プログラムが成長するとき、特に多くの人がそれに関与するとき、いわゆる「デッドコード」の断片が必然的に発生し始めます。 これらは、新しい関数に置き換えられた残りの関数、またはプログラマが忘れたテストコードです。

このような断片にいくつかのクリティカルマスが蓄積すると、アルゴリズムで予期しないアクションが発生する可能性があります。これは、第3の観点からは、意志の発現またはプログラムの「ソウル」と呼ばれます。



引用は正確であるふりをしませんが、ポイントはそうです。 さまざまな言語のさまざまな値の変数名をチェックすることに関するHaberの最近のトピックに照らして(申し訳ありませんが、リンクを見つけることができませんでした)、私に起こった小さなケースを説明することにしました。 おそらく、コードで最も一般的なエラーであることが判明した「魂の顕現」に遭遇した場合、彼はコメントに例を投げ込むか、私に招待をしたいと思います。



したがって、問題の本質は1つの機能に収まります-TextChangedイベントを処理します。 処理は、特定の文字を受信すると、カーソル位置の後に特定の行を追加する必要があるという事実にあります。



最初、ハンドラーは次のようになりました。



private void txtMain_TextChanged( object sender, EventArgs e)<br>{<br> //, ( backspace - ) <br> if (txtMain.Text.Length > textlen)<br> {<br> // <br> if (txtMain.Text[txtMain.TextLength - 1] == 'a' )<br> {<br> // try - <br> try <br> {<br> string newSpace = "<inputted a>" ; //- <br> int curPosition = txtMain.SelectionStart; // <br> txtMain.Text = txtMain.Text.Insert(curPosition, newSpace); // <br> txtMain.SelectionStart = curPosition + newSpace.Length; // <br> }<br> catch (Exception ex)<br> {<br> MessageBox.Show(ex.Message); // <br> }<br> }<br> }<br> textlen = txtMain.Text.Length; // , <br>} <br><br> * This source code was highlighted with Source Code Highlighter .







しかし、最初のエラーは非常に簡単に見つかりました-入力したテキストの途中に目的の文字が入力された場合、行は挿入されませんでした。 つまり 最後の文字のみがチェックされました。 次に、7行目を次のように修正しました。



if (txtMain.Text[txtMain.SelectionStart - 1] == 'a' ) <br><br> * This source code was highlighted with Source Code Highlighter .







そして、ここで最も興味深いことが始まりました-メソッドは14行目でIndexOutOfRangeExceptionをスローし始めました。

txtMain.Text = txtMain.Text.Insert(curPosition, newSpace);// <br><br> * This source code was highlighted with Source Code Highlighter .







同時に、両方の場合で関数を入力するとき(連続したテキスト入力の場合-つまり、目的の文字を最後に追加するとき)、両方のプロパティは同じ値-TextLengthとSelectionStartの両方を持ちました。 関数本体の受け渡しも同じように行われましたが、SelectionStartの場合、例外がスローされました。



長い間、前のプロパティと同じ値を返すプロパティの名前を1行で変更した理由を理解できませんでしたが、以下の5行の例外が発生します。



しかし、それは非常に簡単であることが判明しました。 目的の行(例外が発生した場所)を挿入した瞬間に、TextChangedイベントが再び発生しました(論理的に!!)が、SelectionStartが0であったため、文字列の-1文字を指定されたものと比較しようとしましたが、デバッガーでエラーが表示されました7行目ではなく14行目。



実際、最終的な機能コードは次のとおりです。



private void txtMain_TextChanged( object sender, EventArgs e)

{

//, ( backspace - )

//

if (txtMain.Text.Length > textlen && txtMain.SelectionStart > 0)

{

//

if (txtMain.Text[txtMain.SelectionStart - 1] == 'a' )

{

// try -

try

{

string newSpace = "<inputted a>" ; //-

int curPosition = txtMain.SelectionStart; //

txtMain.Text = txtMain.Text.Insert(curPosition, newSpace); //

txtMain.SelectionStart = curPosition + newSpace.Length; //

}

catch (Exception ex)

{

MessageBox.Show(ex.Message); //

}

}

}

textlen = txtMain.Text.Length; // ,

}




* This source code was highlighted with Source Code Highlighter .







All Articles