「レガシーコード」とはいったい!?
 レガシーコード」
~あなたも書いてるレガシーコード~
 あなたも書いてるレガシーコード~
         レガシーコード

         高橋邦彦
         大中浩行
13-E-4
     ...
自己紹介

 高橋邦彦(たかはし くにひこ)
   本日進行役
   id:kunit
 新しいフレームワークを作ろうとしていろい
 ろ調べているうちに REST と TDD の魅力
 に取り付かれて今に至る
 2008年5月より株式会社ディノ...
自己紹介


 大中浩行(おおなかひろゆき)
 (株)エルテックス 商品開発室
 azusa@fieldnotes.jp / @setoazusa
 Working Effectively With Legacy Code 読
 書会幹事
 S...
自己紹介
 中谷 秀洋(なかたに しゅうよう)
 サイボウズ・ラボ株式会社
  Web 間アプリフレームワーク flowr
  英単語タイピングゲーム iVoca


 コンピュータと無縁の就職をするも、社長の鶴の
 一声で、一人情シス(兼業)...
自己紹介


 川西 俊之(かわにしとしゆき)

 仕事ではC/C++で開発からテストまで

 テスト管理システムTestLink
 C言語用BDDフレームワークCSpec
それでは
「レガシーコード」とはいっ
 たい!?

~あなたも書いてるレガシーコード~
あらため
現場で闘う
あなたに贈る
レガシーコード迎撃
座談会
副題:
副題:
クラウドもSaaSも
iPhoneも
レガシーやろ!
スタート!
まず、皆さんに
問題
Q:レガシーコード
とはいったい何?
COBOLで書
A:
かれたコード
Win NT 4.0
A:
用のコード
あの先輩か
A:
ら引き継いだ
コード
その答えを求めて
教科書を
ひもといてみましょう
現場で闘う
あなたのための
バイブル
※翔泳社から
日本語訳出版決定!
レガシーコード
とは
一般には
「理解しづらい・変更しにく
 いコードのこと」
を指すかもしれない
ただ、この本に
よれば
レガシーコード
とは
ずばり
テストのないコード
を指す
Working Effectively with Legacy Code p.xvi
そう
明日あなたが
書くコードも
レガシーコード
かもしれない
では、私たちは
いったいどうしていけば
良いのだろう
それを共々に
考えていきましょう
本日の
本日の目標

レガシーから 逃げない
レガシーを 作らない
レガシーを 作り込ませない
本日の
本日の目標

そのために
各人がすべきことを
探すきっかけを作る
それが
レガシーコード
迎撃
座談会
それでは、
ここで、
本題に入る前に
レガシーを語る上での
基本用語を押さえましょう
 Edit & Pray
 Cover & Modify
Edit & Play
 編集し、そして祈る
 不安を抱きながらコードを変更
 うまくいったと一息つくのも束の間
 たまに、納品後にその不安が的中
 現在のソフトウェア開発の主流
 (by Working Effectively with Le...
Cover & Modify
 カバーして、変更する
 変更の正しさ確めるテストを用意
 作成したテストをセーフティネットと
 してコードを変更
 変更の影響がわかるので安心
 このセッションでこれを目指したい
ということで
ここからが本題
今日のお題
今日のお題
  のお

 実践レガシーコード
 レガシー座談会
 コミュニケーションとしての
 レガシーコード
 まとめ
実践レガシーコード
 ※フィクションです。たぶん
その1
その

//コンストラクタ
//コンストラクタ
public TooLong (String
 path,Map map1,Map
 map2,String id, IIF intf)
….
どうやって生成
すりゃいいんだ
?
その1・
その ・テストケース

public void testTooLong() {
TooLong tooLong = new
  TooLong(null,null,null,nul
  l,null);
  ….
}
→Pass Null
その2
その2

private DataSource dataSource;

public void doLogic() throws Exception
  {
Connection con =
   dataSource.getConn...
その2
 その2
InitialContext ictx = new InitialContext();
DataSource ds = (DataSource)
  ictx.lookup(quot;java:comp/env/jdbc/Sa...
テストのためなら
リフレクションも
厭わず
その3
その3(Before)

 Properties prop = new Properties();
 ServletContext servletContext =
           ContextFactory.getContex...
その3
その3(After)
Properties prop = new Properties();
if (ContextFactory.hasContext()) { // 本番
  ServletContext servletContex...
やりすぎ?
そこで…
その3
その3(ContextFactory内)
                  内

 public static void
   setContext(ServletContext
   fakeServletContext) {
 s...
→静的setter
その4
その

MysteriousObject obj = new
 MysteriousObject();
Result result =
 obj.mysteriousLogic();
//どうassertするの?
…
その4
その4

Result result =
 obj.mysteriousLogic();
assertEquals(quot;ありえない
 リターンquot;,
 result.getString());
→Characterization
Tests
いろいろ

 データベースのテストには
 Seasar2(S2Unit)が有効
  DBの操作とトランザクション管理が分離
  されていることが前提ですが…
 どこにテストを書くのか?
  何をテストしたいのか
   →どこにバグがありそうか
...
まとめ

 依存性を解決するために、本番
 コード側に手をいれることがあり
 ます
 テストを通すことよりも、今ある
 コードの振る舞いを明らかにす
 ることを優先しましょう
「レガシーコード」とはいったい?
「レガシーコード」とはいったい?
「レガシーコード」とはいったい?
「レガシーコード」とはいったい?
Upcoming SlideShare
Loading in...5
×

「レガシーコード」とはいったい?

21,168

Published on

オープニング+「実践レガシーコード」

Published in: Technology, Economy & Finance
0 Comments
13 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
21,168
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
156
Comments
0
Likes
13
Embeds 0
No embeds

No notes for slide
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • <number>
  • 「レガシーコード」とはいったい?

    1. 1. 「レガシーコード」とはいったい!? レガシーコード」 ~あなたも書いてるレガシーコード~ あなたも書いてるレガシーコード~ レガシーコード 高橋邦彦 大中浩行 13-E-4 中谷秀洋 川西俊之
    2. 2. 自己紹介 高橋邦彦(たかはし くにひこ) 本日進行役 id:kunit 新しいフレームワークを作ろうとしていろい ろ調べているうちに REST と TDD の魅力 に取り付かれて今に至る 2008年5月より株式会社ディノで Web アプ リケーション開発を行っている
    3. 3. 自己紹介 大中浩行(おおなかひろゆき) (株)エルテックス 商品開発室 azusa@fieldnotes.jp / @setoazusa Working Effectively With Legacy Code 読 書会幹事 Seasarプロジェクトコミッタ
    4. 4. 自己紹介 中谷 秀洋(なかたに しゅうよう) サイボウズ・ラボ株式会社 Web 間アプリフレームワーク flowr 英単語タイピングゲーム iVoca コンピュータと無縁の就職をするも、社長の鶴の 一声で、一人情シス(兼業)として内製&外注 (中略) 現在に至る
    5. 5. 自己紹介 川西 俊之(かわにしとしゆき) 仕事ではC/C++で開発からテストまで テスト管理システムTestLink C言語用BDDフレームワークCSpec
    6. 6. それでは
    7. 7. 「レガシーコード」とはいっ たい!? ~あなたも書いてるレガシーコード~
    8. 8. あらため
    9. 9. 現場で闘う あなたに贈る レガシーコード迎撃 座談会
    10. 10. 副題: 副題: クラウドもSaaSも iPhoneも レガシーやろ!
    11. 11. スタート!
    12. 12. まず、皆さんに 問題
    13. 13. Q:レガシーコード とはいったい何?
    14. 14. COBOLで書 A: かれたコード
    15. 15. Win NT 4.0 A: 用のコード
    16. 16. あの先輩か A: ら引き継いだ コード
    17. 17. その答えを求めて 教科書を ひもといてみましょう
    18. 18. 現場で闘う あなたのための バイブル ※翔泳社から 日本語訳出版決定!
    19. 19. レガシーコード とは
    20. 20. 一般には 「理解しづらい・変更しにく いコードのこと」 を指すかもしれない
    21. 21. ただ、この本に よれば
    22. 22. レガシーコード とは
    23. 23. ずばり テストのないコード を指す Working Effectively with Legacy Code p.xvi
    24. 24. そう
    25. 25. 明日あなたが 書くコードも
    26. 26. レガシーコード かもしれない
    27. 27. では、私たちは いったいどうしていけば 良いのだろう
    28. 28. それを共々に 考えていきましょう
    29. 29. 本日の 本日の目標 レガシーから 逃げない レガシーを 作らない レガシーを 作り込ませない
    30. 30. 本日の 本日の目標 そのために 各人がすべきことを 探すきっかけを作る
    31. 31. それが レガシーコード 迎撃 座談会
    32. 32. それでは、 ここで、 本題に入る前に
    33. 33. レガシーを語る上での 基本用語を押さえましょう Edit & Pray Cover & Modify
    34. 34. Edit & Play 編集し、そして祈る 不安を抱きながらコードを変更 うまくいったと一息つくのも束の間 たまに、納品後にその不安が的中 現在のソフトウェア開発の主流 (by Working Effectively with Legacy Code)
    35. 35. Cover & Modify カバーして、変更する 変更の正しさ確めるテストを用意 作成したテストをセーフティネットと してコードを変更 変更の影響がわかるので安心 このセッションでこれを目指したい
    36. 36. ということで ここからが本題
    37. 37. 今日のお題 今日のお題 のお 実践レガシーコード レガシー座談会 コミュニケーションとしての レガシーコード まとめ
    38. 38. 実践レガシーコード ※フィクションです。たぶん
    39. 39. その1 その //コンストラクタ //コンストラクタ public TooLong (String path,Map map1,Map map2,String id, IIF intf) ….
    40. 40. どうやって生成 すりゃいいんだ ?
    41. 41. その1・ その ・テストケース public void testTooLong() { TooLong tooLong = new TooLong(null,null,null,nul l,null); …. }
    42. 42. →Pass Null
    43. 43. その2 その2 private DataSource dataSource; public void doLogic() throws Exception { Connection con = dataSource.getConnection(); ….. }
    44. 44. その2 その2 InitialContext ictx = new InitialContext(); DataSource ds = (DataSource) ictx.lookup(quot;java:comp/env/jdbc/SampleDSquot;) ; Field[] fields = Demo2.class .getDeclaredFields(); for (Field field : fields) { if (field.equals(quot;dataSourcequot;)) { field.setAccessible(true true); true field.set(instance, ds); } }
    45. 45. テストのためなら リフレクションも 厭わず
    46. 46. その3 その3(Before) Properties prop = new Properties(); ServletContext servletContext = ContextFactory.getContext(); prop.put(quot;PROP_PATHquot;, servletContext.getRealPath (quot;WEB-INF/prop.propertiesquot;));
    47. 47. その3 その3(After) Properties prop = new Properties(); if (ContextFactory.hasContext()) { // 本番 ServletContext servletContext = ContextFactory.getContext(); prop.put(quot;LIB_PATHquot;, servletContext .getRealPath(quot;WEB-INF/prop.propertiesquot;)); } else { // テスト prop.put(quot;LIB_PATHquot;, quot;WEB- INF/prop.propertiesquot;); }
    48. 48. やりすぎ? そこで…
    49. 49. その3 その3(ContextFactory内) 内 public static void setContext(ServletContext fakeServletContext) { servletContext = fakeServletContext; }
    50. 50. →静的setter
    51. 51. その4 その MysteriousObject obj = new MysteriousObject(); Result result = obj.mysteriousLogic(); //どうassertするの? …
    52. 52. その4 その4 Result result = obj.mysteriousLogic(); assertEquals(quot;ありえない リターンquot;, result.getString());
    53. 53. →Characterization Tests
    54. 54. いろいろ データベースのテストには Seasar2(S2Unit)が有効 DBの操作とトランザクション管理が分離 されていることが前提ですが… どこにテストを書くのか? 何をテストしたいのか →どこにバグがありそうか →プログラマーとしての直感を信じよう
    55. 55. まとめ 依存性を解決するために、本番 コード側に手をいれることがあり ます テストを通すことよりも、今ある コードの振る舞いを明らかにす ることを優先しましょう
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×