💊

関数でクラスを表現する

2023/09/13に公開

目次

  1. 概要
  2. 実装

概要

オブジェクト指向言語で使用されるクラスを関数でも表現出来るのではと思いました。
オブジェクト指向で良く聞く変数と処理の「カプセル化」を関数で実装します。

実装

type Todo = {
  title: string;
  limit: string;
  isCompleted: boolean;
};

const TodoClass = () => {
  const data: Todo = {
    title: "",
    limit: "",
    isCompleted: false,
  };

  const setTodo = (title: string, limit: string): void => {
    data.title = title;
    data.limit = limit;
  };

  const getTodo = (): Todo => {
    return data;
  };

  const changeIsCompleted = (): void => {
    data.isCompleted = !data.isCompleted;
  };

  const isLimited = (): boolean => {
    const limitDate = new Date(data.limit);
    const now = new Date();
    return limitDate < now;
  };

  return { setTodo, getTodo, changeIsCompleted, isLimited };
};
const { setTodo, getTodo, changeIsCompleted, isLimited } = TodoClass();

setTodo("洗濯", "2023/09/13");

if (isLimited()) {
  changeIsCompleted();
}

const todo = getTodo();

console.log(todo);
/** 
 *  出力結果
 *  {
 *    "title": "洗濯",
 *    "limit": "2023/09/13",
 *    "isCompleted": true
 *  } 
 */

Discussion