質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

479閲覧

javascript 几帳な関数のリファクタリング

bonne

総合スコア1

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/11/27 06:08

前提

Javascriptのリファクタリング方法で悩んでいます。
読み込んだCSVファイルの各データをデータベースのマスタテーブルと照合し、4種類のリスト、new_items = [], new_sales = [], new_licensor_items =[], new_game_title_items = [] にpushしています。function query_master_with_csvではそれぞれcsvのアイテムを判定し、上記の指定のリストにpushしています。
ですがlistにpushする際にobject型で追加したいので以下のロジックを4 つほど書いています。

javascript

1new_sales.push({ 2 licensor_id : dict_licensors[upload_items[i].Licensor], 3 licensor_name : upload_items[i].Licensor, 4 contract_id : get_contract_id(upload_items[i]['Game Title: Name'], db_master_data)[0], 5 contract_name : get_contract_id(upload_items[i]['Game Title: Name'], db_master_data)[1], 6 game_title_id : dict_game_titles[upload_items[i]['Game Title: Name']], 7 game_title_name : upload_items[i]['Game Title: Name'], 8 division_id: dict_divisions[upload_items[i]['Division: Name']], 9 division_name : upload_items[i]['Division: Name'], 10 sales_id : dict_sales_accounts[upload_items[i]['Account (Line): Name']] ? dict_sales_accounts[upload_items[i]['Account (Line): Name']] : null, 11 sales_account_name : upload_items[i]['Account (Line): Name'], 12 currency : upload_items[i]['Currency: Currency Symbol'], 13 item_id : dict_child_items[upload_items[i].Item], 14 item_code : upload_items[i].Item, 15 item_name : upload_items[i]['Display Name'], 16 item_type : upload_items[i]['Item: Item Type'], 17 //Fixme: get royalty from db 18 royalty_type : null, 19 royalty_per_unit : null, 20 royalty_percentage : null, 21 sold_quantity : upload_items[i]['Qty. Sold'], 22 total_revenue : upload_items[i]['Formula'], 23 discount : upload_items[i]['Amount (Discount)'], 24 sales : upload_items[i]['Total Revenue'], 25 order_date : upload_items[i].Month+'-01' 26 });

かなり几帳な関数になってしまっていますがどうリファクタリングすればわからず投稿させていただきました。

該当のソースコード

javascript

1/** 2 * The function of uploading items existing in child_item of database from csv 3 * It also returns new item list and new licensor's item list 4 * Using recursive for reading easily 5 * @params {number} i - current record number. max value is the upload sales records from csv 6 * @return {array[object], array[object]} { new_ltems, new_licensors_items } - Returns new items list and new licensor's item list 7 */ 8 9const db_master_data = get_master_data.data; 10const dict_licensors = get_dicts_from_array('licensor_name', 'licensor_id', db_master_data) 11const dict_game_titles = get_dicts_from_array('game_title', 'game_title_id', db_master_data) 12const dict_divisions = get_dicts_from_array('division_name', 'division_id', db_master_data) 13const dict_sales_accounts = get_dicts_from_array('sales_account_name', 'sales_account_id', db_master_data) 14const dict_child_items = get_dicts_from_array('child_item_code', 'child_item_id', db_master_data) 15 16const len_upload_items = select_csv.parsedValue['0'].length; 17const upload_items = select_csv.parsedValue['0'] 18var new_items = [], new_sales = [], new_licensor_items =[], new_game_title_items = [] 19/** 20 * Todo - comment 21 */ 22function get_dicts_from_array(name, primay_key, master_data){ 23 const dict = {}; 24 master_data.forEach(r => dict[r[name]] = r[primay_key]) 25 return dict; 26} 27 28function get_contract_id(game_title_name, master_data){ 29 const data = master_data.find(r => r.game_title === game_title_name); 30 return data ? [ data.contract_id, data.contract_name ] : [null, null]; 31} 32 33/** 34 * The function of insert sales data that the child_item_code exists in child_item 35 * @params {array[object]} sales_data - the sales data of existing child_item_code 36 * @return None 37 */ 38function update_sales_data(sales_data){ 39 bulk_insert_new_sales_records.trigger({ 40 addtionalScope: sales_data 41 }) 42 console.log(sales_data); 43} 44 45/** 46 * The function of querying master table and distinct existing items or new items 47 * Using recursive for reading easily 48 * @params {number} i - current record number. max value is the upload sales records from csv 49 * @return {array[object], array[object], array[object], array[object]} 50 * { new_sales, new_items, new_game_titles_items, new_licensors_items, new_sales } 51 * - Returns new items list and new licensor's item list 52 */ 53function query_master_with_csv(i){ 54 if (i >= len_upload_items) { 55 //update_sales_data(new_sales); 56 console.log("Succesfully upload existing items"); 57 return; 58 } 59 const is_item_in_db = !!dict_child_items[upload_items[i].Item]; 60 if(is_item_in_db){ 61 console.log(i + "Item " + upload_items[i].Item + " is existing item"); 62 new_sales.push({ 63 licensor_id : dict_licensors[upload_items[i].Licensor], 64 licensor_name : upload_items[i].Licensor, 65 contract_id : get_contract_id(upload_items[i]['Game Title: Name'], db_master_data)[0], 66 contract_name : get_contract_id(upload_items[i]['Game Title: Name'], db_master_data)[1], 67 game_title_id : dict_game_titles[upload_items[i]['Game Title: Name']], 68 game_title_name : upload_items[i]['Game Title: Name'], 69 division_id: dict_divisions[upload_items[i]['Division: Name']], 70 division_name : upload_items[i]['Division: Name'], 71 sales_id : dict_sales_accounts[upload_items[i]['Account (Line): Name']] ? dict_sales_accounts[upload_items[i]['Account (Line): Name']] : null, 72 sales_account_name : upload_items[i]['Account (Line): Name'], 73 currency : upload_items[i]['Currency: Currency Symbol'], 74 item_id : dict_child_items[upload_items[i].Item], 75 item_code : upload_items[i].Item, 76 item_name : upload_items[i]['Display Name'], 77 item_type : upload_items[i]['Item: Item Type'], 78 //Fixme: get royalty from db 79 royalty_type : null, 80 royalty_per_unit : null, 81 royalty_percentage : null, 82 sold_quantity : upload_items[i]['Qty. Sold'], 83 total_revenue : upload_items[i]['Formula'], 84 discount : upload_items[i]['Amount (Discount)'], 85 sales : upload_items[i]['Total Revenue'], 86 order_date : upload_items[i].Month+'-01' 87 }); 88 query_master_with_csv(i+1); 89 return; 90 } 91 const is_game_title_in_db = !!dict_game_titles[upload_items[i]['Game Title: Name']]; 92 if(is_game_title_in_db){ 93 console.log(i + "Item: " + upload_items[i].Item + "is new item and Game Title: " + dict_game_titles[upload_items[i]['Game Title: Name']] + "exists"); 94 new_items.push({ 95 licensor_id : dict_licensors[upload_items[i].Licensor], 96 licensor_name : upload_items[i].Licensor, 97 contract_id : get_contract_id(upload_items[i]['Game Title: Name'], db_master_data)[0], 98 contract_name : get_contract_id(upload_items[i]['Game Title: Name'], db_master_data)[1], 99 game_title_id : dict_game_titles[upload_items[i]['Game Title: Name']], 100 game_title_name : upload_items[i]['Game Title: Name'], 101 division_id: dict_divisions[upload_items[i]['Division: Name']], 102 division_name : upload_items[i]['Division: Name'], 103 sales_id : dict_sales_accounts[upload_items[i]['Account (Line): Name']] ? dict_sales_accounts[upload_items[i]['Account (Line): Name']] : null, 104 sales_account_name : upload_items[i]['Account (Line): Name'], 105 currency : upload_items[i]['Currency: Currency Symbol'], 106 item_id : null, 107 item_code : upload_items[i].Item, 108 item_name : upload_items[i]['Display Name'], 109 item_type : upload_items[i]['Item: Item Type'], 110 royalty_type : null, 111 royalty_per_unit : null, 112 royalty_percentage : null, 113 sold_quantity : upload_items[i]['Qty. Sold'], 114 total_revenue : upload_items[i]['Formula'], 115 discount : upload_items[i]['Amount (Discount)'], 116 sales : upload_items[i]['Total Revenue'], 117 order_date : upload_items[i].Month+'-01' 118 }); 119 query_master_with_csv(i+1); 120 return; 121 } 122 const is_licensor_in_db = !!dict_licensors[upload_items[i].Licensor]; 123 if(is_licensor_in_db){ 124 console.log(i + "Item: " + upload_items[i].Item + "is new item, and Licensor: " + upload_items[i].Licensor + "exists. This item needs to be associated with contracts."); 125 new_game_title_items.push({ 126 licensor_id : dict_licensors[upload_items[i].Licensor], 127 licensor_name : upload_items[i].Licensor, 128 contract_id : null, 129 contract_name : null, 130 game_title_id : null, 131 game_title_name : upload_items[i]['Game Title: Name'], 132 division_id: dict_divisions[upload_items[i]['Division: Name']], 133 division_name : upload_items[i]['Division: Name'], 134 sales_id : dict_sales_accounts[upload_items[i]['Account (Line): Name']] ? dict_sales_accounts[upload_items[i]['Account (Line): Name']] : null, 135 sales_account_name : upload_items[i]['Account (Line): Name'], 136 currency : upload_items[i]['Currency: Currency Symbol'], 137 item_id : null, 138 item_code : upload_items[i].Item, 139 item_name : upload_items[i]['Display Name'], 140 item_type : upload_items[i]['Item: Item Type'], 141 royalty_type : null, 142 royalty_per_unit : null, 143 royalty_percentage : null, 144 sold_quantity : upload_items[i]['Qty. Sold'], 145 total_revenue : upload_items[i]['Formula'], 146 discount : upload_items[i]['Amount (Discount)'], 147 sales : upload_items[i]['Total Revenue'], 148 order_date : upload_items[i].Month+'-01' 149 }); 150 query_master_with_csv(i+1); 151 return; 152 query_master_with_csv(i+1); 153} 154 155query_master_with_csv(0);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2022/11/27 06:36

「几帳(きちょう)」ではなく「冗長(じょうちょう)」では
guest

回答1

0

ベストアンサー

そもそも異なる4種類のデータを一つのCSVで表現するのをやめ、データ自体のリファクタリングをした方が良いと思うが、プログラムレベルであれば次のステップで考えるかな~

  1. とりあえず差分を気にせずCSVの1行(upload_items)からオブジェクトに変換する共通関数、例えばrecord2object関数を作る
  2. new_items、new_sales、new_licensor_items、new_game_title_itemsで共通する項目、違いがある項目を整理する
  3. if(is_game_title_in_db)などの分岐では、まずrecord2objectでオブジェクトを取得し整理した差分をrecord2objectで取得したオブジェクトに反映する

javascript

1if(is_item_in_db){ 2 var obj = record2object() 3 // 差のあるところだけ分岐内で追加実装 4 obj.contract_id = get_contract_id(obj['Game Title: Name'], db_master_data)[0]) 5 // 中略 6 new_items.push(obj) 7} 8

投稿2022/11/27 09:39

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bonne

2022/11/29 20:29

ありがとうございます!確かに共通化するところを共通化すればスッキリしそうですね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問