【配列対応版公開中】JavaScriptでIsEmptyとIsNotEmptyを実装しよう【必要ないことは無い】

JavaScriptFirefox, Google Chrome, IE11, バリデーション, 共通部品

JavaScript

JavaScriptでIsEmptyを独自実装

IsEmpty とは、一般的にStringの空文字チェックを行う関数です。

この記事で取り上げるのは、String Number Array Object などの全般について、nullだったり、undefinedだったり、キー無しオブジェクトだったり、要素0のリストだったりの判定を行う関数です。

JavaScriptは型明記無しで動作する(せざるを得ない)ので、Stringだけをターゲットに関数を作成するのはNGにしました。必ず、入ってくるのが文字列という担保が取れているならOKです!

他言語(やフレームワーク)だと、IsEmpty関数を利用して、判定するのでしょうが、JavaScriptだと無いのです。という事で、部品化しておきたいところ。

部品は「汎用性」をモットーに作成するとして、色々、組み込み過ぎて遅く・重くなるのは避けたい。(なんと、ワガママ!)

ベストプラクティスという訳ではありませんが、作ってみました。

動作確認ブラウザ:IE11、Firefox、Google Chrome

ソースコード

下準備:

下のコードをjsファイルに張り付ける。

他の個所からは、BaseUtil.IsEmpty(変数) で呼び出し可能です。

var BaseUtil;
(function (BaseUtil) {
    /**
     * IsEmpty
     * @param obj {any} - Target Object
     */
    BaseUtil.IsEmpty = function (obj) {
        if (obj === undefined || obj === null) {
            return true;
        }
        else if (Object.prototype.toString.call(obj).slice(8, -1) === "String") {
            if (obj === "") {
                return true;
            }
        }
        else if (Object.prototype.toString.call(obj).slice(8, -1) === "Array") {
            if (obj.length === 0) {
                return true;
            }
        }
        else if (Object.prototype.toString.call(obj).slice(8, -1) === "Object") {
            if (!Object.keys(obj).length) {
                return true;
            }
        }
        return false;
    };
    /**
     * IsNotEmpty
     * @param obj {any} - Target Object
     */
    BaseUtil.IsNotEmpty = function (obj) {
        return !BaseUtil.IsEmpty(obj);
    };
})(BaseUtil || (BaseUtil = {}));

JavaScript部品のご紹介

String Number Array Object など全般的に上の部品で対応が可能です。

IsNotEmptyも用意しているので、If文の中で「!」を付け忘れて、バグを生むような事も減るでしょう。!とかの反転1文字ミスって意外と気づけないんですよね。

また、「BaseUtil」は自由に変更ください。「CommonUtil」は、業務共通処理かな?と思ったので、基盤系となる共通処理をBaseUtilにしています。※保守性を考慮して、DateUtilやStringUtilなども有りだと思います。

最後に

JavaSciprtに、「IsEmptyがいらない」みたいな考え方を持つ方もいるのですが、そういう方とプロジェクトが一緒になると困ってしまう……。

if文に直接使えば、暗黙的に判定が可能だとか言うのだが「可読性」とか「保守性」を考えて欲しい。趣味のプログラミングじゃないんだから!! というより、プログラミングしかできない人は、そういう発想に至るのだと思う。(設計書に書かれている事を、実現できればそれで良い。)

 

Aさん:IsEmptyは作る必要が無い。IF文で対応が可能だ。
    IsEmptyを作る工数があるなら、各機能PGを優先して進めるべきだ。

私:IsEmptyがいらないという事なので、それで進めます。
  Bさん達は、この判定関連で何かあれば、AさんにQAお願いします。

Bさん:分かりました。では、早速ですが「クロスブラウザ」については、
    PG考慮は不要。あるいは、プロジェクトとしてのPG方針が明確になっている、
    していただける認識でよろしいですか?

Aさん:明確になっている。別途、周知する。

私:横断的に何らかの対応が必要となった場合、
  Aさんが責任を持って対応いただける認識で良いですか?

Aさん:その時の作業進捗を見て、PLに判断してもらうため、
    一概に自分が対応すると言えない。

―後日―

PL:「私」さん。実は、空文字チェックしてるところなんだけど、
  一部、トリムして空の場合(スペースのみ入力されている場合)も、
  Emptyとして欲しいんだよね。対応できるかな?

私:その件は、Aさんに確認をお願いしてもらえますか。

Aさん:できますよ。空文字チェックの各場所の変数に「trim()」を付ければ可能です。

私:「null」や「undefined」に対して、trim()したらエラーになります。
  IF文をネストする必要がある上、if文が各所にあるため対象の洗い出しにも
  工数がかかるため、簡単では無いです。

Aさん:実現可否だけを答えただけで、そんな事は分かっている。

PL:簡単じゃない事を分かった上で、対応できる。ということは、
  Aさんにお願いしていいかな?  

~~~ちょっと余談~~~

Aさん:IsEmptyは作る必要が無い。IF文で対応が可能だ。
    IsEmptyを作る工数があるなら、各機能PGを優先して進めるべきだ。

私:IsEmptyがいらないという事なので、それで進めます。
  Bさん達は、この判定関連で何かあれば、AさんにQAお願いします。

Bさん:分かりました。では、早速ですが「クロスブラウザ」については、
    PG考慮は不要。あるいは、プロジェクトとしてのPG方針が明確になっている、
    していただける認識でよろしいですか?

Aさん:明確になっている。別途、周知する。

私:横断的に何らかの対応が必要となった場合、
  Aさんが責任を持って対応いただける認識で良いですか?

Aさん:その時の作業進捗を見て、PLに判断してもらうため、
    一概に自分が対応すると言えない。

―後日―

PL:「私」さん。実は、空文字チェックしてるところなんだけど、
  一部、トリムして空の場合(スペースのみ入力されている場合)も、
  Emptyとして欲しいんだよね。対応できるかな?

私:その件は、Aさんに確認をお願いしてもらえますか。

Aさん:できますよ。空文字チェックの各場所の変数に「trim()」を付ければ可能です。

私:「null」や「undefined」に対して、trim()したらエラーになります。
  IF文をネストする必要がある上、if文が各所にあるため対象の洗い出しにも
  工数がかかるため、簡単では無いです。

Aさん:実現可否だけを答えただけで、そんな事は分かっている。

PL:簡単じゃない事を分かった上で、対応できる。ということは、
  Aさんにお願いしていいかな?  

Aさん:すみません。今、進捗が遅れていて余裕がありません。

PL:私さんか、Bさんで出来ないかな?

私:私もBさんも、スケジュールに余裕があるので対応できますが、
  Aさんが考える対応方針以外を提案します。
  今後、このようなユーザ要求が発覚したときの工数削減のため、
  共通部品化した方が良いと考えています。

PL:今回も唐突だったからね。今後のためなら部品化して欲しいけど、
   工数は大丈夫かな?

Bさん:私さんと2人でやれば、設計からPTまでで1日で終わります。

PL:じゃあ、お願いします。

~~~~~~~~~~~~~~~

共通部品と製造や、呼び出し箇所も含めて1日で対応が終わった。(呼び出し箇所の対応は面倒だったが、2人で手分けすれば対応できた。)※今回紹介しているコードは、Trimなどの別機能は除外してます。

結果として、ネットで調べて「いらない(無くてもできる)」ということを、今のプロジェクトに適用できると簡単に鵜呑みにしてはいけないよ! という教訓だ。

このサイトも含めて、ネットに書いてある全てが真実とは限らない、真実だとして、今の自分に当てはまるかどうかは、「自分自身」で判断しなければならない。 という事を、心に留めておく必要があります。

スポンサーリンク