ChatGPTでNCMBのコードを書いてみる


何かと話題なChatGPTですが、読める文章以外にもプログラミングコードの生成も可能です。

ということで、ニフクラ mobile backend向けのコードをどれくらいの精度で書けるのか試してみました。

## 1回目

一回目は以下のように日本語で入力しました。

```json
NCMBのJavaScript SDKを使ってデータストアからデータを取得するコードを教えてください
```

生成されたコードは以下の通り。これは普通に動くコードですね…

```jsx
var NCMB = require("ncmb");

var ncmb = new NCMB("your_application_key", "your_client_key");
var TestClass = ncmb.DataStore("TestClass");

TestClass.fetchAll()
    .then(function(results){
        console.log(results);
    })
    .catch(function(error){
        console.log(error);
    });
```

しかも説明書きもあります。

> In this example, you first import the NCMB library and then initialize it with your application_key and client_key. Then you create a new DataStore object with the name "TestClass" and fetch all the objects stored in it by calling the fetchAll method. The method returns a promise which resolves to an array of objects, or rejects with an error.

意訳すれば以下のような感じです。見事ですね。

> この例では、まずNCMBライブラリをインポートし、application_keyとclient_keyで初期化します。次に、"TestClass "という名前で新しいDataStoreオブジェクトを作成し、fetchAllメソッドを呼び出してそこに格納されているすべてのオブジェクトをフェッチします。このメソッドはオブジェクトの配列を返すか、エラーで失敗します。

## 2回目

varは古い構文なので変更してもらいました。

```
varは止めて、constにしてください
```

生成されたコードは以下の通りです。ちゃんと直りました。

```jsx
const NCMB = require("ncmb");

const ncmb = new NCMB("your_application_key", "your_client_key");
const TestClass = ncmb.DataStore("TestClass");

TestClass.fetchAll()
    .then(results => {
        console.log(results);
    })
    .catch(error => {
        console.log(error);
    });
```

## 3回目

then/catch構文はネストが深くて分かりづらくなるので、async/awaitに変更してもらいます。

```
then/catchはやめて、awaitにしてください
```

生成されたコードです。 `async function` で囲まれました。

```jsx
const NCMB = require("ncmb");

const ncmb = new NCMB("your_application_key", "your_client_key");
const TestClass = ncmb.DataStore("TestClass");

async function getData() {
  try {
    const results = await TestClass.fetchAll();
    console.log(results);
  } catch (error) {
    console.log(error);
  }
}

getData();
```

## 4回目

関数を即時関数に変更してもらいました。

```
getData関数でなく、無名関数を即実行する形にしてください
```

生成されたコードです。的確です。

```jsx
const NCMB = require("ncmb");

const ncmb = new NCMB("your_application_key", "your_client_key");
const TestClass = ncmb.DataStore("TestClass");

(async () => {
  try {
    const results = await TestClass.fetchAll();
    console.log(results);
  } catch (error) {
    console.log(error);
  }
})();
```

## 5回目

さらにクラス名（TestClass）だけ変更してみます。

```
TestClassではなく、Helloにしてください
```

生成されたコードです。変数名も変わっています。

```jsx
const NCMB = require("ncmb");

const ncmb = new NCMB("your_application_key", "your_client_key");
const Hello = ncmb.DataStore("Hello");

(async () => {
  try {
    const results = await Hello.fetchAll();
    console.log(results);
  } catch (error) {
    console.log(error);
  }
})();
```

## まとめ

最初に生成されたコードが素晴らしすぎて、驚きです。[イントロダクション (JavaScript & Monaca) : クイックスタート](https://mbaas.nifcloud.com/doc/current/introduction/div_quickstart_javascript.html)にある公式ドキュメントがベースになっていると思われますが、 `fetchAll` メソッドをデータ取得（かつ配列）だと認識しているのが凄いです。

ちなみに最初の1件と指定すると、以下のようになります。惜しい…

```jsx
var NCMB = require("ncmb");

var ncmb = new NCMB("アプリケーションキー", "クライアントキー");
var TestClass = ncmb.DataStore("TestClass");

TestClass.fetchAll()　// fetchAll()はいらない
  .limit(1)
  .fetch()
  .then(function(results) { // レスポンスは配列ではない
    console.log(results[0]);
  })
  .catch(function(error) {
    console.error(error);
  });
```

とはいえ、それっぽいコードを生成した後で多少手直しするだけでも十分使い物になりそうです。