DelFusa Blog 総本山

プログラミングの話題とかです。

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| スポンサー広告 | --:-- | comments(-) | trackbacks(-) | TOP↑

≫ EDIT

テストくどい開発とか


    ∧,,∧  
   ミ,,゚Д゚∩
    ミ つ旦 ミ
  ~と,,,~),,~) 


リファクタリングしてみました。あっさり完成。

まあ、ソースコードの内容は必要な方以外は読み飛ばしておくれ。D2007だしね。

ちなみにD2009でも普通のコードなら普通に動くはずだけど
WideStringをStringに置き換えるとフルにD2009のunicodeに対応さ。


さてさて、伝えたいのはソースの具体例ではあまりなかったりします。
だから、流し見してもらっておきましょう。

まあ、動くよ。試してみて。

function CommentDelete(Source: WideString; BraceTable: TBraceTable): WideString;

 function FindCommentStart(const str: WideString; FromIndex: Integer;
  out SearchIndex: integer; out braceInfo: TBraceInfo ): boolean;
 var
  bt: Integer;
  i: integer;
 begin
  SearchIndex := MaxInt;
  for bt := Low(BraceTable) to High(BraceTable) do
  begin
   i := RangeWidePosForward( braceTable[bt].BeginMark, str , FromIndex);
   if (0 < i) and (i < SearchIndex) then
   begin
    braceInfo := BraceTable[bt];
    SearchIndex := i;
   end;
  end;
  Result := False;
  if SearchIndex < MaxInt then
   Result := True;
 end;

var
 SearchIndex, i, LoopCount: integer;
 removeLen: integer;
 bi: TBraceInfo;
 SourceIndex, ResultIndex: Integer;

 procedure ResultWrite(StartIndex, EndIndex: Integer);
 var
  i: Integer;
 begin
  for i := StartIndex to EndIndex do
  begin
   Result[ResultIndex] := Source[SourceIndex];
   Inc(ResultIndex); Inc(SourceIndex);
  end;
 end;

begin
 SetLength(Result, Length(Source));
 SourceIndex := 1; ResultIndex := 1;
 while FindCommentStart(Source, SourceIndex, SearchIndex, bi) do
 begin
  if bi.Remove then
   LoopCount := SearchIndex - SourceIndex
  else
   LoopCount := SearchIndex - SourceIndex + Length(bi.BeginMark);
  ResultWrite(1, LoopCount);

  if bi.EndMark = '' then
  begin
   Continue;
  end;
  SearchIndex := RangeWidePosForward(bi.EndMark, Source, SourceIndex);

  if SearchIndex = 0 then
  begin
   if not bi.Remove then
    ResultWrite(SourceIndex, Length(Source));
   SetLength(Result, ResultIndex-1);
   Exit;
  end;

  if bi.Remove then
  begin
   if bi.EndMark = EndOfLine then
    SourceIndex := SearchIndex
   else
    SourceIndex := SearchIndex + Length(bi.EndMark);
  end else
  begin
   ResultWrite(SourceIndex, SearchIndex);
  end;
 end;

 ResultWrite(SourceIndex, Length(Source));
 SetLength(Result, ResultIndex-1);
end;

これより早いコードはまだ書けると思うけど
おそらくは、前回の文字列をResult := Result + αとかDeleteしている
ものより、数百倍近くは早いから、漏れは存分にこれで満足。

さて、ここで重要なのは前から何度か話題にしている
リファクタリングとかテストファースト。

これを最近ではテスト駆動開発とかよんでいるらしいです。

なんだかなぁ。
また、適当な用語つくっちゃって顧客や非開発者を煙に巻こうとしている
戦略なんだか、ちょっと自分が高尚な事をやっているんですよという
アピールをしたい開発者も多いですからね。

イベントドリブン開発のまねしてテストドリブンなんですかしら。
テストが何かを"駆動"するわけじゃないので、全然意味わからないと
思うですが、まあ、いいでしょう。

テストファーストです。
最初にテストコードを書く。というのが、最近の他言語でのトレンド。

Delphi界隈では見かけた事ほとんどありませんが、

@ITでは、今月2記事も出るくらいの盛況さ。
普通に楽しそうな記事だから、どーぞ。

@IT自分戦略研究所の「おすすめエンジニアライフ」: Eclipseで3倍プログラミング
今を生き抜くエンジニアのためのITスキル: 開発スピード3倍のプログラミングテクを習得せよ

まあ、内容は面白くて為になるかな~と、漏れは感じたんですが。

それはともかく、エクリプスで三倍だそうですよ。旦那!(w
何をもって三倍かわかりませんが。赤色ですか?ツノ生えてますか?
エクリプスと関係なく、こいつはエクストリームプログラミングのテクなのですが
なんで3倍なのかしら。(w

こりゃ最高峰の開発スピードを誇るDelphi使いの皆々様もこれを取り入れなきゃね。
エクリプスで3倍なら、うちらは3倍は超えないといけませんでしょー。
漏れはノンバグコーディングと呼んでますけどね。

わかりやすく3倍プログラミングと呼んでみたのかな。

WikiPediaでリファクタリングを調べてみてください。
『テストの重要性』と書かれています。

今回のこの文字列操作。
主要言語のソースコードからコメントを削除するコード

私みたいなぼんくらプログラマでも、
このテスト駆動開発(wを使うとすぐに作れてしまいます。

皆さん、どーぞ、使っていきましょう。

例えばこちらのブログ

Owl's perspective


ここのDelphiソースコードのHTML化、素敵なHTML化ですよね。
コメントは緑色、登録単語は水色、文字列は青色
この生成コード、きっと、あなたも気軽に書けるようになれるかもよー。

…それにしても、そちらのコード、数値の0だけ、どうやって判断させているか
わからんな.…数値の前後が英単語じゃない場合だけ数値と判断するのかな?

まあ、いいや。

とりあえず、おやすみなさい。
スポンサーサイト

| 未分類 | 00:26 | comments:3 | trackbacks(-) | TOP↑

COMMENT

> …それにしても、そちらのコード、数値の0だけ、どうやって判断させているか
> わからんな.…数値の前後が英単語じゃない場合だけ数値と判断するのかな?

はい、どーぞ。
http://code.google.com/p/syntaxhighlighter/

オイラはTEADでやってるけどね。
パーサ作れれば強調構文表示なんぞ簡単、簡単。

| DEKO | 2008/11/15 01:18 | URL | ≫ EDIT

おおお!ありがとうございます。

パーサーの作り方を、是非是非もっともっと。

レクチャーなど開いていただきたいものっす。

| ミ・д・彡 | 2008/11/15 01:23 | URL | ≫ EDIT

TParser

TParser
http://docs.codegear.com/docs/radstudio/radstudio2007/RS2007_helpupdates/HUpdate4/JA/html/delphivclwin32/Classes_TParser.html
が参考になるかと。

DFMの解析はこれでできるのだから、多少の改良を行えばDelphi(Pascal)の解析もOKになります。そこから他言語用を作るのもそんなに難しくはないです。

<!>注意<!>
Delphi2009 で TParser を使う場合には "toString" の扱いに気を付けて。

| DEKO | 2008/11/15 02:00 | URL | ≫ EDIT















非公開コメント

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。