質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

「加工」と「処理」の違いにおける「出力データ」とは?

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 2,015

score 17199

余所様の質問で申し訳ありませんが、下記回答で疑問に思った箇所があったので質問致します。

jQueryのみならず、これらの操作はプログラミング言語の間で Optional とともに語られます。Optional の界隈において、
「加工」は
入力データに"対して"何らかの処理を施し、"出力データを伴う"ものです。
「処理」は
入力データを"元に"何らかの処理を行いますが"出力データを伴いません"。

RyogaK さんはこのように説明しています。
まず、ここでいう「出力データ」とは関数の返り値という認識で正しかったでしょうか。
この前提が正しいと仮定して、関数の返り値がundefined以外の場合に出力されたと見なすという認識でいいのでしょうか。
(ECMAScript では関数は必ず何がしかの返り値を持つ仕様であり、ユーザ定義関数において return がなければ undefined を返す仕様である為、undefined は例外と考えました。)

'use strict';
var array = [0, 1, 2], result;

result = jQuery.each(array, function (i, element) { return element * 2; });
console.log(array);   // [0, 1, 2] (jQuery.each は破壊的ではない)
console.log(result);  // [0, 1, 2] (jQuery.each は出力を伴うので「加工」)

result = jQuery.map(array, function (element) { return element * 2; });
console.log(array);   // [0, 1, 2] (jQuery.map は破壊的ではない)
console.log(result);  // [0, 2, 4] (jQuery.map は出力を伴うので「加工」)

result = array.indexOf(9);
console.log(array);   // [0, 1, 2] (Array.prototype.indexOf は破壊的ではない)
console.log(result);  // -1 (Array.prototype.indexOf は出力を伴うので「加工」)

先の前提で考えると、jQuery.eachjQuery.mapArray.prototype.indexOf は全て返り値を持つので「加工」という認識になってしまいます。
直感的には jQuery.each や Array.prototype.indexOf は「加工」ではなく、「処理」と考えたくなるのですが、どのように考えるのが正しいのでしょうか。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

jQuery.eachのソースを見ると、

// args is for internal usage only
    each: function( obj, callback, args ) {
        var value,
            i = 0,
            length = obj.length,
            isArray = isArraylike( obj );

        if ( args ) {
            if ( isArray ) {
                for ( ; i < length; i++ ) {
                    value = callback.apply( obj[ i ], args );

                    if ( value === false ) {
                        break;
                    }
                }
            } else {
                for ( i in obj ) {
                    value = callback.apply( obj[ i ], args );

                    if ( value === false ) {
                        break;
                    }
                }
            }

        // A special, fast, case for the most common use of each
        } else {
            if ( isArray ) {
                for ( ; i < length; i++ ) {
                    value = callback.call( obj[ i ], i, obj[ i ] );

                    if ( value === false ) {
                        break;
                    }
                }
            } else {
                for ( i in obj ) {
                    value = callback.call( obj[ i ], i, obj[ i ] );

                    if ( value === false ) {
                        break;
                    }
                }
            }
        }

        return obj;
    },


http://code.jquery.com/jquery.js
「加工」せずに元のオブジェクトを返しているようですね。つまり戻り値はjQueryのスタイルであるメソッドチェーンを実現するために存在しているのであって、実質的には戻り値はないと考えてよさそうです。

そもそも、mapは関数型言語から導入されてきたと思いますので、mapは関数型言語的、eachは手続き型言語的、ということを平易な言葉で回答しようとすると「戻り値の有無」になるのは納得できます。
厳密じゃないな、という感想はとてもよく分かります(Optionalは関係なくね?とか)。ただ、分かりやすさのために厳密さを損なうのはよくある、というか初心者向けの文章には推奨されるものではないでしょうか。



ちなみに、think49さんなら「加工と処理の違い」をどう定義されますか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/16 22:18

    なんかズレた回答をしてしまったような気がしてきました。ズレついでに付け加えると、indexOfは加工でいいんじゃないか、とおもいます。

    キャンセル

  • 2016/03/16 22:37

    仰る通り、jQuery.each は jQuery.prototype.each で関数を使いまわす為(jquery-2.2.1.js の136行目)に返り値を this 値に相当するオブジェクトにしているのでしょうね。
    実際、Array.prototype.forEach は undefined を返しますし、その方がしっくり来ます。
    [0, 1, 2].forEach(new Function); // undefined

    > ちなみに、think49さんなら「加工と処理の違い」をどう定義されますか?
    ES6 に限定するなら、Object.assign, Object.defineProperty, Array.from, Array.prototype.slice, Array.prototype.map, Array.prototype.sort String.prototype.replace は「加工」といって差し支えないと思っています。
    その前提で定義するならこんなところでしょうか。

    - 加工 === 入力データを元に改変し、『入力データと同じフォーマット』もしくは『入力データの特徴を一定以上持ったフォーマット』で出力される事
    - 処理 === Statement もしくは FunctionDeclaration (SyntaxError にならないコードの最小単位)

    Array.from があるので同じフォーマットと定義するわけにいかず、だからといって「一定以上」を定義する事もできず。
    私には厳密に定義する事が出来そうにないですね。

    キャンセル

checkベストアンサー

0

加工すると、データを出力する。
という話であって、
データを出力したならば、それは加工である。
という話ではないと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/16 22:58

    もともとは、Haskell言語のMaybeモナドに由来します。
    それが他の言語では、Optionalという名前で実装されることがあります。
    これは、「Nullかもしれない値」を表す値で、通常は何らかの値をラップします。

    つまり、今回の件とは無関係ということです。

    キャンセル

  • 2016/03/17 08:49

    ありがとうございます。
    Stripeさんを説明を踏まえて、http://qiita.com/shindooo/items/815d651a72f568112910 を読み、朧気ながら理解出来ました。
    「Optional は ES6 の `Promise` のように Optional クラスでラップして関数型言語っぽく書けるもの」と解釈しました。
    想像するに、RyogaKさんは「if文を加工して Optional クラスにラップ(加工)した」と説明したかったのでしょうか。

    キャンセル

  • 2016/03/29 19:20

    RyogaKさんからの回答を期待していましたが、回答がなさそうなのでクローズします。
    Optional について説明していただいた Stripe さんをベストアンサーとしたいと思います。
    ご回答ありがとうございました。

    キャンセル

0

加工(かこう、processing)は、原材料に手を加えて製品を製作すること。
処理(しょり)とは:. 物事を裁くこと、処置。 廃棄処分すること。 ゴミ処理 · 加工すること。 熱処理、表面処理など; 食品加工 - 食材の調理 · コンピューティング (processing) - コンピュータによる電算処理。(wikipedia) 

プログラムの話に言葉の意味を持ち込んでも不毛かも知れませんが。
処理は恐らく加工を包括します。
処理が出力を持たないというのは、加工と区別した場合の話のように思われます。

加工は手を加えることですので、その出力は入力を原料にして作成された何かになるのではないでしょうか?
Validationの関数がtrueやfalseを返してもそれは加工とは言わないと思います。
そういう意味ではmapだけが加工されたデータを出力しているように見えます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/17 22:19

    「加工食品」という言葉があります。
    例えば、「魚」を原料として加熱⇒練ると「かまぼこ」になり、「加工食品」とされます。
    しかし、「魚」を包丁で切っただけの「刺身」は「生鮮食品」とされます。
    http://www.maff.go.jp/j/fs/f_label/f_fresh/
    どちらも加工していますが、単純にカットしただけでは「加工食品」と見なされません。

    あくまで個人的な考えですが、JavaScript に例えると次のようになるのかなと思っています。
    ・jQuery.each は原料(入力データ)には手をつけず、そのまま出力しているので「加工」ではない
    ・jQuery.map は原料(入力データ)を元に値を変化させて出力しているので「加工」である
    ・Array.prototype.indexOf は原料(入力データ)を元にindex値を算出するが、原料そのものには手をつけていないので「加工」ではない(例えば、魚のうろこの数を数えて記録を提出しているようなイメージ)

    キャンセル

  • 2016/03/17 22:32 編集

    > しかし、「魚」を包丁で切っただけの「刺身」は「生鮮食品」とされます。
    読んで字のごとくというか、工程、工夫を加える事が加工だと思いますので、
    刺身は「加工食品」には分類されないかも知れませんが、魚を加工した何かのはす。
    魚を処理したものが刺身だというと違和感があります。

    一般的には、完成品が出力される処理工程を加工と呼称するように思います。
    しかし魚を例にすると、
    1.下ごしらえした状態は処理でも、加工でも違和感なさそうです。
    2.血抜きも処理したとも加工したとも言えると思います。
    3.計量しただけでは、加工とは言いませんが、計量(処理)済みとは言えそうです。
    RyogaK氏は1,2のような加工途上の状態も、処理からの出力であれば加工であると分類しているのだと思います。

    > 単純にカットしただけでは「加工食品」と見なされません。
    「食品」に加工されて後、それ以上の加工処理が入っていないという解釈でどうでしょう?

    > JavaScript に例えると次のようになるのかなと思っています。
    ここ以下の解釈に同意です。読み直してみるとRyogaK氏も同じような事を言っているように見えます。

    キャンセル

  • 2016/03/29 19:19

    String.prototyoe.slice は刺身の定義からすると「加工」ではない(カットしただけなので)ですが、感覚的には「加工」と表現したくなります。
    あくまで主観的なもので厳密な定義は無いのかもしれませんね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る