• 締切済み

流用の定義について

組み込み系開発の規模算出にて、お尋ねします。 今回はステップ数での開発規模算出を行っています。 そこで、質問です。新規Step数は新規に書く予定のStep数です。 変更Step数は元のコードから変更する予定のStep数です。 そして本題ですが、流用Step数とは具体的に何を示しますか? 元々存在したコード数を記載しますか? それとも確認や試験を行うStep数ですか? 例えば、 switch(a) |元からあったコード { |元からあったコード case OK: |元からあったコード i=1; |元からあったコード break; |元からあったコード case NG: |元からあったコード i=2; |追加したコード //i=3; |削除したコード break; |元からあったコード case HOGE: |追加したコード i=4; |追加したコード break; |追加したコード } |元からあったコード 以上で新規、変更、流用のStep数はどのように数えますか? お手数ですが、解説しているサイト等もご存知でしたら、ご教示願います。

みんなの回答

  • saru_
  • ベストアンサー率39% (38/97)
回答No.1

規模算出を依頼した人に確認した方がいいのでは? いくら、ここで「一般的な算出方法はこれこれです」なんて回答が得られても(そんな物があるという話は聞いたことがありませんが)、依頼者が求めている意味あいと異なれば、意味はありませんよね? 一般には、流用ステップ数と言えば、既存のコードを流用することで、開発しないで済む部分のステップ数を指すと思われます。質問のケースのように既存のソースに手を加える必要がある場合は、例えば、既存のコードの30%くらいに手を入れる必要があるとすれば、流用ステップ数は、元のソースの70%になる訳です。 ところで何か誤解しているようですので少しだけ補足しますが、通常、開発規模の見積りの目的は、あくまでコストと期間を可能な限り正確に予測することにあり、完成するソースコードのステップ数を正確に予測すること自体には意味がありません。また、見積りにかける労力も常識的な範囲内に限られる必要があります。 したがって、既存の類似機能をもったモジュールのソースコードをカウントすることで、予測の精度と客観性を向上させることには意味がありますが、細かいソースコードの特定の部分を取り出してきて、ここのステップ数はいくつだろう???と悩むのは、本末転倒であり、時間の無駄以外の何物でもありません。

occure
質問者

お礼

アドバイスありがとうございます。 今回の質問は、流用の一般的な定義について、お尋ねしたものです。例示も実コードではありません。また、お仕事の心配まで頂いていますが、これは既に解決済みです。 今回はあくまでも流用の一般的な定義をお教え頂きたいと思っております。 -------------------------------------------------------------- 一般には、流用ステップ数と言えば、既存のコードを流用することで、開発しないで済む部分のステップ数を指すと思われます。質問のケースのように既存のソースに手を加える必要がある場合は、例えば、既存のコードの30%くらいに手を入れる必要があるとすれば、流用ステップ数は、元のソースの70%になる訳です。 --------------------------------------------------------------- 以上の定義を借りると、例えば、1KStepの規模のソースで、30%は見直して変更追加が必要なコードとの仮定から、700stepが流用ですね。 この700stepについては、単体試験は行わず、機能試験のみに留めるとするという定義でいいのでしょうか? これは、仮定の見積もり30%は見直してとなる根拠は、関数単位ですか?あるいは、コード単位、ファイル単位、クラス単位などがあろうかと思いますが、いずれを元に算出しますか? 例示したコードも、あくまでも参考です。どのように数えるのか勉強のため、お聞きしたものです。 以上、よろしくお願い致します。

関連するQ&A

  • Perlソース(拡張子.cgi)のステップ算出ツールはありますか。

    CやC++なら通常のSTEPカウンタツールで対象規模を 算出できるのですが、Perlソースのステップはでき ませんでした。   無理やり拡張子を.cに変更し、ステップ算出を行い ましたが、どうも正確ではありません。   何か便利なツールはありますか。 また、htmlファイルのステップ算出ツールも探して います。

    • ベストアンサー
    • Perl
  • PHPによるフォーム入力プログラムの流用性を高めたい

    フォーム入力プログラムを作る時 こんな感じのパターンが多いと思います。 [STEP1] 新規入力させる STEP2で、同意をえれない場合、入力内容を再入力する [STEP2] 必須項目が入力しているかどうかをチェックし、 できていなければ、エラーを表示する。 入力項目一覧を表示、ユーザーにこれでいいか同意を求める。 だめならSTEP1へ戻る よければSTEP3へ進む [STEP3] 入力した内容をデータベースにインサートする。 入力した内容をメールでセンドする。 二重投稿を防止する。 と、フォームのロジックパターンとしては どんなフォームを作成してもある程度決まっているのですが、 再度同じようなフォームを作成する時、 ロジックパターンはある程度決まってても 前回作成したものの流用性はほとんど効かず、 毎度作成に大変時間がかかってしまいます。 具体的には、前回作ったフォームをコピペしたり変更しても 変更する内容が多すぎて 結局、一からフォームを書くのとさほど変わらないということです。 そこでもっと流用性を高める設計方法はないのだろうかと 考えてみたのですが、良い解決方法が見つかりません。 いかなるフォーム形態であろうと、 いかなるデータ数であろうと、 自在にフォームの改変が容易にできる。 そんな設計方法があれば、アドバイスをお願いします。

    • ベストアンサー
    • PHP
  • 最大10文字の10進数文字を16進数に変換し表示する

    最大10桁の16進数文字を数字の10進数で表示するコードを記述する事は出来たのですが、その逆が、どうしてもうまくいきません。16進数文字を数字の10進数で表示させるコードをベースに何処の箇所を修正すれば10進数文字を16進数に変換出来るのでしょうか?初心者で難しいコードが解らない為、ダラダラとしたコードで申し訳ございません。 また、今、C言語の文字列の勉強をしてる為、いくつか仕様がありますので、宜しくお願いします。 (1)入力された10進数文字を数値の10進数に変換させた後に、16進数の文字として表示させる。 (2)「printf」以外の関数は使用しない。 (3)最後に表示させる時は「%s」を使用する。 ------------------------------------------------- 【最大10桁の16進数文字を数字の10進数で表示】 #include "stdafx.h" #define MEX 10 /*「function」:入力文字された文字数*/ char ToInt( char cInt) { int mal=0; switch (cInt){ case '0': mal=0; break; case '1': mal=1; break; case '2': mal=2; break; case '3': mal=3; break; case '4': mal=4; break; case '5': mal=5; break; case '6': mal=6; break; case '7': mal=7; break; case '8': mal=8; break; case '9': mal=9; break; case 'a': mal=10; break; case 'A': mal=10; break; case 'b': mal=11; break; case 'B': mal=11; break; case 'c': mal=12; break; case 'C': mal=12; break; case 'd': mal=13; break; case 'D': mal=13; break; case 'e': mal=14; break; case 'E': mal=14; break; case 'f': mal=15; break; case 'F': mal=15; break; } return (mal); } /*「function」:位の計算*/ double HexAcc( double n ) { int i; double ans=1; for( i=0; i<n; i++ ){ ans *= 16; } return (ans); } int _tmain(int argc, _TCHAR* argv[]) { int i=0,n=0,j=0,k=0,s=0,m=0; char decimal[ 255 ], ditto[ 255 ],sub[ 255 ]; /*入力されない場合*/ if( argc > 1 ){ decimal[s] = argv[1][i]; } else{ printf("16進数を入力してください。\n"); return 1; } /*subに文字として'\0'を代入*/ for( k=0; k<=128; k++ ){ sub[k] = '0'; } /*入力された文字数を受取る*/ for( i=0; argv[1][i] != '\0'; i++ ){ decimal[i] = argv[1][i]; } decimal[i] = '\0'; /*空白文字のチェック*/ for( i=0; decimal[i] != '\0'; i++ ){ if( decimal[i] != ' ' ){ ditto[n] = decimal[i]; n++; } } /*'\0'を代入(文字列の終端)*/ ditto[n]='\0'; /*「0」から「9」のループ*/ for( n=0; ditto[n] != '\0'; n++ ){ if(( ditto[n] == '0' ) || ( ditto[n] == '1' ) || ( ditto[n] == '2' ) || ( ditto[n] == '3' ) || ( ditto[n] == '4' ) || ( ditto[n] == '5' ) || ( ditto[n] == '6' ) || ( ditto[n] == '7' ) || ( ditto[n] == '8' ) || ( ditto[n] == '9' ) || ( ditto[n] == 'A' ) || ( ditto[n] == 'B' ) || ( ditto[n] == 'C' ) || ( ditto[n] == 'D' ) || ( ditto[n] == 'E' ) || ( ditto[n] == 'F' ) || ( ditto[n] == 'a' ) || ( ditto[n] == 'b' ) || ( ditto[n] == 'c' ) || ( ditto[n] == 'd' ) || ( ditto[n] == 'e' ) || ( ditto[n] == 'f' )){ }else{ printf("エラー\n 16進数以外の文字が含まれております。\n"); return 0; } } /*桁数のループ*/ for( n=0; ditto[n] != '\0'; n++ ){ m = m + 1 ; } /*桁数の判断*/ if( m <= MEX ){ }else{ printf("エラー\n入力文字数は、%d文字以内にしてください。\n",MEX); return 0; } /*subにdittoを代入*/ for( n=0; ditto[n] != '\0'; n++){ sub[MEX-m+n] = ditto[n]; } /*'\0'を代入(文字列の終端)*/ sub[MEX] = '\0';*/ /*「double型:addの初期化」「int型:ans初期化」add・ansの初期化*/ double ans=0; double add=0; /*sub[0]からsub[9]の計算*/ for( n=0; sub[n] != '\0'; n++){ ans = ToInt(sub[n]); add += ans * HexAcc(MEX-n-1); } /*最大10桁の16進数文字を数字の10進数で表示*/ printf("最大10桁の16進数文字を数字の10進数に変換した値は %f \n",add);

  • for文を使用して値を代入したいです。教えてください。

    5桁の10進数文字を16進数に変換するコードを作成したのですが、コード上の「商と余りを配列に代入」の箇所をfor文で作成したいのですが、うまくいかず1文1文のコードになってしまいました。「商と余りを配列に代入」する箇所に、当てはまるfor文のコードの所だけ、書き換えたいので教えていただけないでしょうか? //10進数文字を数字の16進数で表示// #include "stdafx.h" #define HEX 5 //「function」:入力文字された文字の処理// char ToInt( char cInt) { int mal=0; switch (cInt){ case '0': mal=0; break; case '1': mal=1; break; case '2': mal=2; break; case '3': mal=3; break; case '4': mal=4; break; case '5': mal=5; break; case '6': mal=6; break; case '7': mal=7; break; case '8': mal=8; break; case '9': mal=9; break; } return (mal); } //「function」:入力文字された文字数// char HexInt( char eInt) { char mul=0; switch (eInt){ case 0: mul='0'; break; case 1: mul='1'; break; case 2: mul='2'; break; case 3: mul='3'; break; case 4: mul='4'; break; case 5: mul='5'; break; case 6: mul='6'; break; case 7: mul='7'; break; case 8: mul='8'; break; case 9: mul='9'; break; case 10: mul='A'; break; case 11: mul='B'; break; case 12: mul='C'; break; case 13: mul='D'; break; case 14: mul='E'; break; case 15: mul='F'; break; } return (mul); } //「function」:桁数の計算(10×指数を計算)// int HexAcc( int n ) { int i; int ans=1; for( i=0; i<n; i++ ){ ans *= 10; } return (ans); } int _tmain(int argc, _TCHAR* argv[]) { int i=0,n=0,j=0,k=0,s=0,m=0; char decimal[255], ditto[255],sub[255],temp[255],flip[255],na[255]; int u=0,odd=0; int a=0,b=0; int sam1=0,sam2=0,sam3=0,sam4=0,sam5=0; int mas1=0,mas2=0,mas3=0,mas4=0,mas5=0; if( argc > 1 ){ decimal[s] = argv[1][i]; } else{ printf("10進数を入力してください。\n"); return 1; } for( k=0; k<=HEX; k++ ){ sub[k] = '0'; } for( k=0; k<=HEX; k++ ){ temp[k] = '0'; } for( k=0; k<=HEX; k++ ){ flip[k] = '0'; } for( k=0; k<=HEX; k++ ){ na[k] = '0'; } for( i=0; argv[1][i] != '\0'; i++ ){ decimal[i] = argv[1][i]; } decimal[i] = '\0'; for( i=0; decimal[i] != '\0'; i++ ){ if( decimal[i] != ' ' ){ ditto[n] = decimal[i]; n++; } } ditto[n]='\0'; for( n=0; ditto[n] != '\0'; n++ ){ if(( ditto[n] == '0' ) || ( ditto[n] == '1' ) || ( ditto[n] == '2' ) || ( ditto[n] == '3' ) || ( ditto[n] == '4' ) || ( ditto[n] == '5' ) || ( ditto[n] == '6' ) || ( ditto[n] == '7' ) || ( ditto[n] == '8' ) || ( ditto[n] == '9' )){ }else{ printf("エラー\n 10進数を入力してください。\n"); return 0; } } for( n=0; ditto[n] != '\0'; n++ ){ m = m + 1 ; } if( m <= HEX ){ }else{ printf("エラー\n入力文字数は、%d文字以内にしてください。\n",HEX); return 0; } for( n=0; ditto[n] != '\0'; n++){ sub[HEX-m+n] = ditto[n]; } sub[HEX] = '\0'; int ans=0, add=0; for( n=0; sub[n] != '\0'; n++){ ans = ToInt(sub[n]); add += ans * HexAcc(HEX-n-1); } //商と余りを配列に代入// sam1 = add / 16; mas1 = add - sam1 *16; temp[0] = mas1; sam2 = sam1 / 16; mas2 = sam1 - sam2 * 16; temp[1] = mas2; sam3 = sam2 / 16; mas3 = sam2 - sam3 * 16; temp[2] = mas3; sam4 = sam3 / 16; mas4 = sam3 - sam4 * 16; temp[3] = mas4; sam5 = sam4 / 16; mas5 = sam4 - sam5 * 16; temp[4] = mas5; //商と余りを配列に代入・ここまでfor文に変更したいです// temp[5]='\0'; for( a=0; a<2; a++ ){ b = temp[a]; temp[a] = temp[4-a]; temp[4-a] = b; } temp[n]='\0'; for( n=0; sub[n] != '\0'; n++){ na[n] = HexInt(temp[n]); } na[5]='\0'; printf("\n10進数文字を16進数で変換した値は %s \n",na); }

  • テストケース数

    ソフトウェア規模から妥当なテストケース数をわりだす式?みたいなものあるでしょうか? たとえば、テスト項目数 = ステップ数 / 10 のような式で ステップ数が100であれば、テスト項目数は10ケースが妥当 みないな感じのものです。

  • 複数の配列から、項目数にあわせてプルダウンへ表示

    お世話様です。 まったくの初心者です。 function todofukenSet(){ //オプションタグを連続して書き換える for ( i=1; i<74; i++ ){ //選択した都道府県によって分岐 switch (document.selbox.todofuken.selectedIndex){ case 0: document.selbox.kuchoson.options[i].text="";break; case 1: document.selbox.kuchoson.options[i].text=tokyo_todofuken[i];break; case 2: document.selbox.kuchoson.options[i].text=kanagawa_todofuken[i];break; case 3: document.selbox.kuchoson.options[i].text=chiba_todofuken[i];break; case 4: document.selbox.kuchoson.options[i].text=saitama_todofuken[i];break; case 5: document.selbox.kuchoson.options[i].text=ibaraki_todofuken[i];break; case 6: document.selbox.kuchoson.options[i].text=tochigi_todofuken[i];break; case 7: document.selbox.kuchoson.options[i].text=gunnma_todofuken[i];break; case 8: document.selbox.kuchoson.options[i].text=yamanashi_todofuken[i];break; case 9: document.selbox.kuchoson.options[i].text=nagano_todofuken[i];break; case 10: document.selbox.kuchoson.options[i].text=shizuoka_todofuken[i];break; } } 抜粋になってしまいますが、 以上の文で、フォームにある<select>の<option>項目を、複数の配列へ分岐させて表示しています。 ですが、配列の項目数が違うため、74より少ない項目に関しては、 「undefined」と表示されてしまいます。 i<74; の部分を、「配列ごとの数を読みとって、その数ごとに表示」 という指示にするには、どのように記述すれば良いでしょうか。 ご教授ください。 何卒よろしくおねがいいたします。

  • WordPressの質問(q10217484)の続

    アップロードされたカメラ画像を非表示にするコードを追加したのですが、表示するためのURLを追加するコードが抜けており追加いたしました。 上記とは別にアップロードされたファイルをエンコードするコードも抜けているのではないかと思っております。 旧コードでは対象ファイルではない場合にアラートで警告ダイアログを表示するコードとは別にエンコードするコードがあるため最新コードにも追加すべきではないかと考えております… 下記のコードは追加すべきでしょうか?(single-input.php の15行目から38行目まで) $attach = []; if (!empty($_SESSION['attach'])) { foreach ($_SESSION['attach']['data'] as $i => $data) { if (!empty($data)) { $base64 = base64_encode($data); } $type = $_SESSION['attach']['type'][$i]; switch ($type) { case 'image/jpeg': case 'image/png': $attach[] = '<img style="height: 100px;" src="data:'.$type.';base64,'.$base64.'">'; break; case 'video/mp4': $attach[] = '<video style="height: 100px;" controls src="data:'.$type.';base64,'.$base64.'">'; break; case 'application/pdf': $attach[] = '<iframe style="height: 100px;" src="data:'.$type.';base64,'.$base64.'"></iframe>'; break; default: $attach[] = ''; break; } } } ※最新コード https://wandbox.org/permlink/my2wffcXlhMQZFvW ※旧コード https://wandbox.org/permlink/cfzsJgBFcYrcIDI1

    • ベストアンサー
    • PHP
  • do - while 文

    以下のコードをコンパイル後実行すると、0~9までの出現回数がわかるのですが、処理を続けますか?と出た後yを入力するともう一度 do 以降を実行するようにしたいのですが、yを入力する前にプログラムが終了してしまいます。何がいけないんでしょうか? #include <iostream> using namespace std; int main (void) { int i; char cont; char c; int count[10] = {0}; do{ while (cin.get(c)){ switch (c){ case '0': count[0]++; break; case '1': count[1]++; break; case '2': count[2]++; break; case '3': count[3]++; break; case '4': count[4]++; break; case '5': count[5]++; break; case '6': count[6]++; break; case '7': count[7]++; break; case '8': count[8]++; break; case '9': count[9]++; break; } } for (i =0; i < 10; i++) cout << i << "の出現回数は" << count[i] << "\n"; cout <<"処理を続けますか?(y/N)"; cin >>cont; }while (cont == 'y'); }

  • createEmptyMoviClipをつかって画像とリンクを設定したい

    createEmptyMovieclipなどを使って、各ムービークリップに画像とリンク設定(getURL)をしたいと思っていますが、初心者なのもので、うまく設定できず困っております。 (その1):下記のコードでは、画像表示は計算通り表示されますが、リンク設定はできないでおります。 ※下記switch文の「case2」は無視していただいても構いません。 ------------------------------------------------------------------------------------------- file_list = new Array(); file_list = ["gazou.jpg","gazou.jpg","gazou.jpg","gazou.jpg","gazou.jpg"]; link = new Array(); link = ["http://www.yahoo.co.jp/" ,"http://www.yahoo.co.jp/" ,"http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/"]; load_obj = new MovieClipLoader(); act_step = 0; this.onEnterFrame = function(){ var i , clip ; switch(act_step){ //各画像を各空MCに割り当て case 0: for(i = 0;i < file_list.length;i++){ clip = this.createEmptyMovieClip("clip" + i ,i); load_obj.loadClip(file_list[i] , clip); } act_step++; break; case 1: loaded_cnt = file_list.length; if(loaded_cnt >= file_list.length) { for(i = 0; i < file_list.length ; i++){ clip = this["clip" + i]; //ムービークリップのサイズと表示位置設定 if(i <= 2){ clip._x = 290*i; } else{ clip._x = 290*i - (290/(i-1)); } clip._y = 50; if(i > 0){ clip._xscale = 100/i; clip._yscale = 100/i; } } act_step++; } break; } } ----------------------------------------------------------------------------------------- (その2)上記コード(その1)でリンク設定ができなかったので、下記のコードのように 「createEmptyMovieClip」を使って、画像表示とリンク設定をしたかったですが、これもうまくいきませんでした。 ---------------------------------------------------------------------------------------- file_list = new Array(); file_list = ["gazou.jpg","gazou.jpg","gazou.jpg","gazou.jpg","gazou.jpg"]; link = new Array(); link = ["http://www.yahoo.co.jp/" ,"http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/"]; act_step = 0; this.onEnterFrame = function(){ var i , clip , rinku; switch(act_step){ //各画像を各空MCに割り当て case 0: for(i = 0;i < file_list.length;i++){ this.createEmptyMovieClip("rinku"+i,i); this.rinku.createEmptyMovieClip("clip" + i ,i); this.rinku.clip.loadMovie(file_list[i] , i); this.rinku.onPress = function(){ getURL(link[i] ,"_self"); } } act_step++; break; case 1: loaded_cnt = file_list.length; if(loaded_cnt >= file_list.length) { for(i = 0; i < file_list.length ; i++){ clip = this["clip" + i]; //ムービークリップのサイズと表示位置設定 if(i <= 2){ clip._x = 290*i; } else{ clip._x = 290*i - (290/(i-1)); } clip._y = 50; if(i > 0){ clip._xscale = 100/i; clip._yscale = 100/i; } } act_step++; } break; } } ------------------------------------------------------------------- 上記「その1」または「その2」を修正して、リンクの設定を行う方法をご教示お願いいたします!

    • ベストアンサー
    • Flash
  • 開発規模について

    一般的な用語なのかも含めて追加開発における開発規模に関する定義を教えていただけないでしょうか? ・母体規模とはどういう定義なんでしょうか? 追加開発する前のプログラム全体を指すのでしょうか? ちなみに、新規規模は、新規にコーディングした規模。修正規模は、元のプログラムを修正して出来上がった規模。開発規模は、新規規模+修正規模と理解しております。