トップ(最新) | <前

nDiki : リファクタリング

リファクタリング - refactoring

リファクタリングする - refactor

Refactoring is the process of changing a software system in such a way that it does not alter the external behavior of the code yet improves its internal structure. -- Refactoring: Improving the Design of Existing Code より

リファクタリングとは、ソフトウェアの外部的振る舞いを保ったままで、内部の構造を改善していく作業を指します。-- リファクタリング-プログラムの体質改善テクニックより

ポイント

関連情報

スポンサード リンク

Related term

2004年6月27日 (日)

過去の今ごろ このエントリーを含むはてなブックマーク

スポンサード リンク

過去の6月27日より。

◇ Twitter やってます。この記事が気にいったらぜひ twitter.com/Naney の follower になってください。


[ 6月27日全て ]

2004年8月2日 (月)

テスト駆動開発入門 このエントリーを含むはてなブックマーク

[ コンピュータ書籍 ]

テスト駆動開発入門 契約による設計における段階的な表明を追加するプロセスの話などが昨日出た。 自分ももちろん assertion を書くのだが、それとは別に最近はテスト・ファーストによる開発お気に入り。 しかしまだ「単体テストのカバー範囲」・「テストケースが充分であるか」・「リファクタリング時のテストの追随」などまだ勇気を持てていない部分がある。

ということで(テストとはまた別ではあるのだが)テスト駆動開発もちょっとチェックしておこうかと思い Kent Beck のテスト駆動開発入門を購入。

紙質も比較的チープ。 本屋でぱっと開いてみると細かいコードの断片が散らばっていて、何かプログラムの初学本っぽくてちょっとどうかなというのが最初の感じ。

しかし読み始めてみると面白く Part 1 までまず読み切った。 レッド/グリーン/リファクタリングのサイクルの中で、コードやテストが書き換わっていく様が非常にわかりやすい。 Martin Fowler のリファクタリング-プログラムの体質改善テクニックと同様細かい作業ステップを実演していて、雰囲気が良くわかる。

テスト駆動開発はテストではなく開発方法である」というのも納得。

「動作するきれいなコード」を書くために続きを読もう。


[ 書評 ]


[ 8月2日全て ]

2004年8月5日 (木)

テスト駆動開発入門読了 このエントリーを含むはてなブックマーク

短めなのですぐ読み終わった。 入門と銘打ってあるが、重要なエッセンスがカバーされているので1冊で結構テスト駆動開発の意味がわかると思う。

  • グリーンにする(テストを通す)ために、アサートで期待する定数を返すようなメソッドをまず作ってしまう。

というのが衝撃的である。 自分でも実際そうした事はあるのだが何か罪悪感があった。 しかし TDD では続くリファクタリングのフェーズがあるので、悪ではない。

また

というのもなるほどという感じ。 コード中での重複はもちろん気を使っているつもりだが、テストとの重複というのは考えたことがなかった。

ぜひ実践してみたい。


[ 書評 ] [ コンピュータ書籍 ]


[ 8月5日全て ]

2004年8月11日 (水)

Perl でテスティングフレームワークを書いてみる このエントリーを含むはてなブックマーク

一昨日 Scheme で書き始めたのだが、やはり不慣れな言語でTDDをやってみるのも大変。

ということでPerlでやってみる。やはり最初はこちらの方が楽。 Perl では「これだ」という xUnit が無い。

WiKicker は Test / Test::Harness を使用する標準的なテストを採用しているが、fixture の処理が面倒に感じている。 なので何か良い xUnit が欲しいのだが、テストのためだけに要求モジュールを追加するのもよろしくないので簡易的なものを自作するのも悪くないかも。

TDDはリズム感があって良いな。 まだリファクタリングフェーズでどの程度リファクタリングしてから、次のレッドフェーズにはいるかの匙加減がまた掴みきれていない。


[ 8月11日全て ]

2005年1月9日 (日)

WiKicker 0.24 半年ぶりのリリース このエントリーを含むはてなブックマーク

NaneyOrgWiki の方でバグレポートをいただいたのを機に、これを修正してリリースパッケージを作成。 リリースは昨年の6月6日以来、約半年ぶり。

バグ修正以外で、大きな機能追加は

ぐらい。 内部的には若干リファクタリングが行われている。

おまけの DiKicker の方はちょこちょこ修正があるが、もともとまだきちんとドキュメント化していないので変更点もきちんとおっかけていない。 DiKicker も安定してきたし、正式版扱いにしてもいいのだが利用者はいるのかな。


[ 1月9日全て ]

2006年8月4日 (金)

Algorithm::RabinKarpソースコード中の重複を発見 このエントリーを含むはてなブックマーク

blog.bulknews.net で紹介されていた、Algorithm::RabinKarp Perl モジュールを試してみた。

ハッシュを使って文字列検索を行う Rabin-Karp アルコリズムを実装しているモジュールで、モジュールをインストールすると rabin.pl というスクリプトが一緒にインストールされる。

これを使うと例えば

 rabin.pl '*.pm' lib > rabin.txt

で lib ディレクトリ内の *.pm ファイル全てのなかで重複する部分を発見してくれる(内部的には File::Find::Rule を使ってファイルを処理している)。 リファクタリング対象になりそうなところを探すのに便利そうだ。

実際使ってみると重複個所がいろいろ発見できて面白い。 ただ、

  • 文字単位で、行の途中から/行の途中までを抽出するため、ソースコードの重複表示としてはちょっとみにくい。
  • 出現回数が多い部分が先に表示される。

などちょっと出力が見にくい面がある(結果の上から見ているとなんだか気持ち悪くなる)。

とりあえず rabin.pl をいじって、最長文字列を先に表示するようにソートの条件を変えたりして遊んでみた。 モジュールの使い方を覚えてスクリプトを自前で書くと、自分好みの重複発見ツールが書けそうだ。


[ 8月4日全て ]

2007年4月23日 (月)

ソフトウェア技術者御用達のプロジェクトマネジメントツール TaskJuggler このエントリーを含むはてなブックマーク

ときたまやってくるソフトウェア開発計画作成、今までは GanttProject を使っていたのだけれども、挙動が安定しないのと印刷機能が貧弱なのとで満足できていなかった。

ということで今回は新しいツールを使ってみることにした。チョイスしたのは TaskJuggler

Linux 上で動くツールである。 GanttProjectWindows でも Linux でも使えるのが利点だったのだが、ここ数年の中でプロジェクトファイルを共有することも無かったので、まあ Linux だけでしか動かなくてもいいかなと。

@ テキスト形式でのプロジェクト記述

TaskJuggler が特徴的なのは、プロジェクトをテキストファイルで記述するところである。 一般的なプロジェクトマネジメントツールは GUI 上でガントチャートを直接編集したりできるのだが、TaskJuggler はそんな軟弱者向けの機能は用意されていない。

あくまでテキストで書く。プロジェクト・リソース・タスク・レポートをテキストファイルに書く。 でコンパイルするとガントチャート等のレポートが生成される。実績もテキストで入力する。

書き方に問題があればコンパイルエラーになるし、定義したタスクの依存関係等でプロジェクト期間からはみ出てしまうような時もコンパイル時に怒られる。 渋い。

@ TaskJugglerUI

とっつきにくく見えるが、慣れると以外とそんなに難しくない。 effort と length と duration の違いが分かればあとは楽勝。

TaskJugglerUI という GUI ソフトウェアでは、補完機能の優れたエディタが内蔵されているしサイドバーのリストからタスク等を選んで、対応する行に移動することもできる。

さながら Eclipse でコードを書いているような感じ。

下手にガントチャート上でタスクをドラッグアンドドロップして、日にちを動かすよりも思った通りに定義していけるので良い。

@ 印刷

ガントチャートについては、それなりに見やすいフォーマットの印刷物を生成してくれる。 印刷からプリンタとして「Print to File (PDF)」を選択すれば日本語も含めて問題なく PDF 化できるので、でき上がったものも配付しやすい(ここら辺は KDE 側の範疇か)。

GanttProject では PDF 出力がイマイチで結局、画像ファイルにエクスポートしてプリントアウト/配付していたのでこれは便利。

@ 面倒な点といえば

面倒な点があるとしたら、タスクに ID をつけてその ID で依存関係などを指定してあげなければいけない点か。 識別子を考えるのが面倒なのと、タスクの数が増えてきた時にその指定したい ID を探す(思い出す)のが面倒である。

あと、識別子の名前変更リファクタリング機能があればいいな (一括置換だと関係ないところまで置換してしまう可能性がある)。

@ ということで

ソフトウェアエンジニアには使いやすいツールだと思う。

マクロ機能やインクルード機能などもあるのでもう少し使いこんでみたい。


[ 4月23日全て ]

2008年3月18日 (火)

今日のさえずり - 「健康診断受けてもいいんですか?」と医者に言われた このエントリーを含むはてなブックマーク

nane:2342235905


[ 3月18日全て ]

2008年6月14日 (土)

スクラッチから書き直したくなるプログラマは、書き直したプログラムもまたスクラッチから書き直したくなる。 このエントリーを含むはてなブックマーク

自分がプログラムをスクラッチから書き直したいと思った時、またスクラッチから書き直したいと言われた時のためにまとめておこう。

@ スクラッチから書き直したい理由

スクラッチから書き直したいと思う理由はだいたいこうだ。

  • もっと良くできると思うから
    • 「もっと良いやり方がある」「自分ならもっとうまく書ける」
    • 「統一されていない」「もっと汎用的にできる」
    • 「今なら新しい開発環境(・新しい実行環境・新しいライブラリ・新しい言語)を使って簡単によりいいものが素早く作れる」
  • よくわからないいから
    • 「何をやっているかわからない」「どう直していいかわからない」
    • 「もう直しようがない」
    • 「作り直した方がはやい」
  • あいつのだから
    • 「あいつが書いたコードだから」

どんなプログラムでも開発が進み詳細がわかってくると、こうしておけば良かったと思う点がでてくるものだ。

さらに、他人が書いたプログラムだとよく分からない。

It's harder to read code than to write it. (プログラムというのは書くより読むほうが難しい。) -- Things You Should Never Do, Part I - Joel on Software

いっそ作り直してしまいたいと思うのはどの開発者でもあることだ。

@ スクラッチから書き直してはいけない理由

しかし多くの場合スクラッチから書き直すことはリスクとデメリットだらけだ。

  • 今までの投資を失うから
    • 「そのプログラムには検討・不具合修正に膨大なエネルギーが投入されている」
    • 「ユーザは今のプログラムのために学習コストをかけている」
  • 時間がかかるから
    • 「その新しいプログラムが今と同じレベルの価値を実現するまでは時間がかかりすぎる」
    • 「スクラッチし直してから投入したのでは、もはや価値を失っている可能性が高い」
  • 前轍を踏むから
    • 「どう直していいかわからないと思う時は往々にして目標がわかっていない。目標がわからずに作ったものは結局またスクラッチから書き直したくなる」
    • 「あなたが連続的にプログラムを修正できないというのなら、どちらにせよ新しく作り直したプログラムもあなたは連続的にプログラムを修正できない」(リグレッションテスト習慣はあるの? リファクタリングスキルはあるの?)

ほとんどの場合は、漸進的に今のプログラムを修正・改良していった方が得策なのだ。

@ スクラッチから書き直してもいい場合

そうはいってももちろんスクラッチから書き直した方が合理的な場合もある(書き直してはいけない場合も書き直した方が合理的だと思ってしまうわけではあるが)。

それは次のような場合だろう。

  • ソースコードがない場合 (ディスククラッシュした。利用する権利がなくなった)。
  • もはや開発環境も実行環境も手に入らず、移植も困難な場合。
  • 個人的な趣味のプログラムの場合。
  • スクラッチから書き直したプログラムに対して、また「スクラッチから書き直したい」という欲求にかられない自信がある場合。

本当にスクラッチから書き直した方がよい場合は止める理由はない。

さてこの記事をスクラッチから書き直したいと思う時がきませんように。

@ 参考


[ ソフトウェアプロジェクトマネジメント ]


[ 6月14日全て ]

2009年8月10日 (月)

C++ソースコードフォーマッタ Uncrustify このエントリーを含むはてなブックマーク

私が Perl が好きな理由の一つとして perltidy が存在しているという点がある。 perltidyソースコード整形は柔軟にカスタマイズができて、自分の好みの整形設定を作っておける。 このツールおかげで後で整形できるので、荒々しくコードを書いてガンガンリファクタリングしていくことできる。

久しぶりに C++開発をするにあたって、C++ の同様のツールを探してみた。 perltidy のように長い式の折り返しを適切に調整してくれる整形ツールはあまり見つからない。いくつか試したところ Uncrustify にたどりついた。

@ 設定

 uncrustify -c /dev/null --update-config-with-doc -o ~/.uncrustify.cfg

するとデフォルトの設定が書き込まれた設定ファイルができる。 これを好みの設定に書き換えていく。

@ ソースコード整形する

 uncrustify source.cpp

とすると整形されたソースコードが source.cpp.uncrustify に出力される。

 uncrustify --replace source.cpp

とすると source.cpp 自体を整形されたソースコードで置き換えてくれる。

@ Emacs からの呼び出し

perltidy の時の設定(記事)で OK。 shell-command-on-region では

  uncrustify -l CPP -q

を実行するようにする。Uncrustify は標準入力からソースコードを渡す際にはどのプログラミング言語が指定してあげる必要がある。

好みの設定は現在模索中。 長い式の中の、引数なしの関数呼び出しの開き括弧と閉じ括弧の間で折り返されることがあってそれが気持ち悪いのだが、それ以外は好みの設定になりつつある。 もうちょっと設定いじってみて確定するつもり。


[ 8月10日全て ]

この日記のはてなブックマーク数 Add to Google RSS

Process Time: 0.513208s / load averages: 0.09, 0.20, 0.18
nDiki by WATANABE Yoshimasa (profile)
Powered by DiKicker
Base theme by Nana (for tDiary)