92
55

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ミノ駆動本を読んでいて

 ITエンジニア本大賞2023でも技術書部門で大賞を取ったみなさんご存知のミノ駆動本。私も買ってJavaのコードをPythonに変換しながら写経していたのですが、私はJavaは全く経験がなかったのでJava→Pythonの変換で学習コストがかかって、とても良い本なのにだんだんこの本で勉強するのが億劫になってしまいました。

 そこで最近ChatGPTで遊んでいる時に、ふと積本たちが視界に入り「ChatGPTを使えばこの問題解決するんじゃね?」、と思いChatGPTにJava→Pythonの変換をさせてみることにしました。

ChatGPTでJava→Pythonの変換

 それでは試しにミノ駆動本のJavaのサンプルコードをChatGPTでPythonに変換させてみましょう。サンプルコードは5章のMagicPoint.javaを使用、ChatGPTには今流行りの深津式プロンプトで入力します。

ChatGPT入力

以下の成約条件のもとJavaコードをPythonに変換して下さい。
# 制約条件
・元のコードと同じようにコメントも入れること
・型ヒントを使うこと
・変更の内容を説明すること

# Javaコード
import java.util.ArrayList;
import java.util.List;

/** 魔法力 */
class MagicPoint {
  private int currentAmount;
  private int originalMaxAmount;
  private final List<Integer> maxIncrements;

  // 省略
  MagicPoint() {
    originalMaxAmount = 100;
    maxIncrements = new ArrayList<>();
  }

  /** @return 現在の魔法力残量 */
  int current() {
    return currentAmount;
  }

  /** @return 魔法力の最大量 */
  int max() {
    int amount = originalMaxAmount;
    for (int each : maxIncrements) {
      amount += each;
    }
    return amount;
  }

  /**
   * 魔法力を回復する
   * @param recoveryAmount 回復量
   */
  void recover(final int recoveryAmount) {
    currentAmount = Math.min(currentAmount + recoveryAmount, max());
  }

  /**
   * 魔法力を消費する
   * @param consumeAmount 消費量
   */
  void consume(final int consumeAmount) {
    // 省略
  }
}

ChatGPT出力

以下は、上記のJavaコードをPythonに変換したものです。

from typing import List

class MagicPoint:
    def __init__(self):
        self.current_amount = 0
        self.original_max_amount = 100
        self.max_increments = []

    def current(self) -> int:
        """現在の魔法力残量を返す"""
        return self.current_amount

    def max(self) -> int:
        """魔法力の最大量を返す"""
        return self.original_max_amount + sum(self.max_increments)

    def recover(self, recovery_amount: int) -> None:
        """魔法力を回復する"""
        self.current_amount = min(self.current_amount + recovery_amount, self.max())

    def consume(self, consume_amount: int) -> None:
        """魔法力を消費する"""
        # 省略
        pass

このコードは、Javaで定義された魔法力を表すクラスをPythonに変換したものです。変換され
たコードは、Javaのコードと構造が似ていますが、いくつかの点で異なります。

Pythonでは、インスタンス変数の宣言時に値を割り当てる必要はありません。変数は初期化され、
必要に応じて値を代入することができます。従って、Pythonのコンストラクタでは、Javaで行わ
れた値の割り当てが省略されます。

Javaのリストは、Pythonのリストに変換されますが、Pythonではリストを宣言する際にデータ型
を指定する必要はありません。ただし、Pythonでは型ヒントとして使用されるため、Pythonコード
ではリストに対しても型ヒントが提供されています。

Javaではvoidメソッドを使用しているため、PythonコードでもNoneを返すことになります。

 いい感じに変換できています。よく見ると変数名がJavaで使われるキャメル型からPythonで使われるスネーク型に変換されていたり、元のコードではMaxメソッドでfor文を使って計算しているところをPythonではsumを使っていたり、言語の特徴に合わせて変換してくれています。

 これならミノ駆動本以外の特定のプログラミングで書かれたデザインパターンや開発手法の技術書でも自分の得意な言語に変換できるので、読書の幅が広がりますね。

最後に

 ChatGPTに触り始めてから4ヶ月くらい経つのですが、なぜこういった使い方になかなか気が付かなかったんだろうと思っています。そういった事柄はまだ色んなところに転がっているのかもしれませんね。

 この記事が誰かの勉強の手助けになれば幸いです。

92
55
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
92
55

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?