はじめに
こんばんは、ACS事業部の東出です。
今日は、GitHub Copilotで業務ロジックが書けるか?について試してみました。
過去、クレジットカード会社の債権管理システムを扱っていたため、それらにちなんだサンプルロジックをCopilotでどこまで書けるかためしてみました。
その1:利息・手数料の計算
キャッシングや分割払いなどをすると、元本に加えて、利息や手数料も返済する必要があります。
それら利息・手数料の計算においては、例えば以下のような考慮が必要です。
- 閏年の考慮(366で割る必要がある)
- 片端で計算する
コメントを数行書いて、サジェストしてもらった結果が↓です。
// 利息・手数料を計算する関数 // 引数は、計算開始日、計算終了日、元本、利率 // 計算式は、元本 * 日割り利率 * 日数 // 日割り利率は、利率 / 365 // 閏年の場合は、366日とする // 利息・手数料は、小数点以下を切り捨てる // 利息・手数料は、整数型で返す function calcInterest(startDate, endDate, principal, interestRate) { // 閏年の日数 const leapYearDays = 366; // 通常の日数 const normalDays = 365; // 日割り利率 const dailyInterestRate = interestRate / normalDays; // 日数 const days = endDate - startDate; // 利息・手数料 const interest = principal * dailyInterestRate * days; // 利息・手数料を返す return Math.floor(interest); }
計算開始日と終了日の間に、通常年と閏年が混在した場合の考慮が不足しています。
これをコメントで足してみて、改めてサジェストしてもらった結果が↓です。
// 利息・手数料を計算する関数 // 引数は、計算開始日、計算終了日、元本、利率 // 計算式は、元本 * 日割り利率 * 日数 // 日割り利率は、利率 / 365 // 閏年の場合は、366日とする // 利息・手数料は、小数点以下を切り捨てる // 利息・手数料は、整数型で返す // 計算開始日と終了日までに通常年と閏年が混在する可能性があるので、以下のように計算する // 例えば、2019/1/1から2025/3/31までの利息を計算する場合、2019年、2021年、2022年、2023年、2025年の利息は通常年で計算し、2020年と2024年の利息は閏年で計算して合計する function calcInterestAndFee(startDate, endDate, principal, interestRate) { // 利息・手数料の合計を保持する変数 var totalInterestAndFee = 0; // 計算開始日と終了日の間の日数を計算する var days = calcDays(startDate, endDate); // 計算開始日と終了日の間の日数分ループする for (var i = 0; i < days; i++) { // 日付を取得する var date = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + i); // 日付から年を取得する var year = date.getFullYear(); // 通常年の場合 if (isNormalYear(year)) { // 利息・手数料を計算する var interestAndFee = calcInterestAndFeeForNormalYear(principal, interestRate); // 利息・手数料の合計に加算する totalInterestAndFee += interestAndFee; } // 閏年の場合 else { // 利息・手数料を計算する var interestAndFee = calcInterestAndFeeForLeapYear(principal, interestRate); // 利息・手数料の合計に加算する totalInterestAndFee += interestAndFee; } } // 利息・手数料の合計を返す return totalInterestAndFee; }
それっぽいような感じに見えますが、、、
計算開始日と終了日の間の日数分ループする
、お前はあかん。
あと、calcInterestAndFeeForNormalYear
のように、コンテキスト上にない関数がサジェストされてます。
関数分けて作れということですね。
その2:利息制限法上の上限金利のチェック
利息制限法とは、金銭消費貸借契約における利息の上限を定めているものです。
所謂、過払い請求の対応においては、グレーゾーン金利で貸付していたものについて、利息の引き直し計算をおこないます。
そんなこんなで、現在の元本における上限金利のチェックロジックをCopilotに書いてもらいました。
// 利息制限法に違反した利率でないかをチェックする関数 function checkInterestRate(interestRate) { if (interestRate > 20) { return false; } return true; }
惜しい!元本によって上限が変わるので、それをコメントで補足します。
// 利息制限法に違反した利率でないかをチェックする関数 // 引数は、元金、利率 // 利息制限法に違反していたら、trueを返す // 元金が100,000円未満の場合は、年利20% // 元金が100,000円以上1,000,000円未満の場合は、年利18% // 元金が1,000,000円以上の場合は、年利16% function checkInterestLimit(capital, interest) { if (capital < 100000 && interest > 20) { return true; } else if (capital >= 100000 && capital < 1000000 && interest > 18) { return true; } else if (capital >= 1000000 && interest > 16) { return true; } else { return false; } }
元金が1,000,000円以上の場合は、年利16%
のコメント、これはCopilotがサジェストしてきたのですが、惜しい!
15%が正解です。。。
やってみた感想
今日は、GitHub Copilotで業務ロジックが書けるか?について試してみました。
所感としては、
- ロジックを細分化したり、プロンプトを工夫することで、ある程度は書けそうかな?
- ただ、(ビジネスロジックじゃない部分もそうですが)鵜呑みはしない方がよさそうかな?
という感じでした。
今回のようなロジックだと、一度実装してしまえばそうそう変わることはないはずなので、しっかりテストして実装しましょう!(お金の計算は怖いので、、、)
さいごに
私達ACS事業部はAzure・AKSを活用した内製化のご支援をしております。ご相談等ありましたらぜひご連絡ください。
また、一緒に働いていただける仲間も募集中です!
切磋琢磨しながらスキルを向上できる、エンジニアには良い環境だと思います。ご興味を持っていただけたら嬉しく思います。