この解答例はChatGPTによって生成されています,正しいかは自己判断で。

BFE.devでのAI解答例 - JavaScript コーディング問題
130. LazyMan() を作る

以下がJavaScriptの解答例になります。

function LazyMan(name, logFn) {
  return new LazyManObj(name, logFn);
}

class LazyManObj {
  constructor(name, logFn) {
    this.name = name;
    this.logs = [];
    this.logFn = logFn || console.log;
    this.sayHi();
    this.execQueue = [];
    setTimeout(() => {
      this.next();
    }, 0);
  }

  next() {
    const task = this.execQueue.shift();
    task && task();
  }

  sayHi() {
    this.enqueue(() => {
      this.logs.push(`Hi, I'm ${this.name}.`);
      this.logFn(`Hi, I'm ${this.name}.`);
      this.next();
    });
  }

  eat(food) {
    this.enqueue(() => {
      this.logs.push(`Eat ${food}.`);
      this.logFn(`Eat ${food}.`);
      this.next();
    });
    return this;
  }

  sleep(seconds) {
    this.enqueue(() => {
      this.logs.push(`(after ${seconds} seconds) Wake up after ${seconds} seconds.`);
      this.logFn(`(after ${seconds} seconds) Wake up after ${seconds} seconds.`);
      setTimeout(() => {
        this.next();
      }, seconds * 1000);
    });
    return this;
  }

  sleepFirst(seconds) {
    this.enqueue(() => {
      this.logs.unshift(`(after ${seconds} seconds) Wake up after ${seconds} seconds.`);
      this.logFn(`(after ${seconds} seconds) Wake up after ${seconds} seconds.`);
      setTimeout(() => {
        this.next();
      }, seconds * 1000);
    });
    return this;
  }

  enqueue(task) {
    this.execQueue.push(task);
  }
}

解説は以下の通りです。

  • LazyMan関数は、LazyManObjクラスのインスタンスを返します。
  • LazyManObjクラスは、namelogFnを引数に取り、それぞれメンバー変数で保管します。
  • sayHi関数は、遅延処理のキューにタスクを追加し、next関数で順次実行されるようにします。
  • eat関数は、sayHiと同様に遅延処理のキューにタスクを追加します。
  • sleep関数は、指定された秒数だけ遅延して次のタスクを実行します。
  • sleepFirst関数は、タスクの実行順序を優先的に設定し、本来の実行順序と逆になっても良いように、配列のunshift関数でタスクを追加します。
  • タスクの順次実行には、execQueue配列を使って処理します。next関数によって、キューの先頭のタスクから順に実行されます。ただし、JavaScriptの仕様上、同期的にタスクを追加した場合は、実行順序が保証されないため、setTimeout関数でnext関数を呼び出すようにしています。