∧,,∧
ミ,,゚Д゚∩
ミ つ旦 ミ
〜と,,,~),,~)
リファクタリングしてみました。あっさり完成。
まあ、ソースコードの内容は必要な方以外は読み飛ばしておくれ。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だけ、どうやって判断させているか
わからんな.…数値の前後が英単語じゃない場合だけ数値と判断するのかな?
まあ、いいや。
とりあえず、おやすみなさい。
