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

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

新規登録して質問してみよう
ただいま回答率
85.48%
ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

3回答

2593閲覧

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

think49

総合スコア18162

ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2016/03/16 11:07

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

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

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

javascript

1'use strict'; 2var array = [0, 1, 2], result; 3 4result = jQuery.each(array, function (i, element) { return element * 2; }); 5console.log(array); // [0, 1, 2] (jQuery.each は破壊的ではない) 6console.log(result); // [0, 1, 2] (jQuery.each は出力を伴うので「加工」) 7 8result = jQuery.map(array, function (element) { return element * 2; }); 9console.log(array); // [0, 1, 2] (jQuery.map は破壊的ではない) 10console.log(result); // [0, 2, 4] (jQuery.map は出力を伴うので「加工」) 11 12result = array.indexOf(9); 13console.log(array); // [0, 1, 2] (Array.prototype.indexOf は破壊的ではない) 14console.log(result); // -1 (Array.prototype.indexOf は出力を伴うので「加工」)

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

javascript

1 // args is for internal usage only 2 each: function( obj, callback, args ) { 3 var value, 4 i = 0, 5 length = obj.length, 6 isArray = isArraylike( obj ); 7 8 if ( args ) { 9 if ( isArray ) { 10 for ( ; i < length; i++ ) { 11 value = callback.apply( obj[ i ], args ); 12 13 if ( value === false ) { 14 break; 15 } 16 } 17 } else { 18 for ( i in obj ) { 19 value = callback.apply( obj[ i ], args ); 20 21 if ( value === false ) { 22 break; 23 } 24 } 25 } 26 27 // A special, fast, case for the most common use of each 28 } else { 29 if ( isArray ) { 30 for ( ; i < length; i++ ) { 31 value = callback.call( obj[ i ], i, obj[ i ] ); 32 33 if ( value === false ) { 34 break; 35 } 36 } 37 } else { 38 for ( i in obj ) { 39 value = callback.call( obj[ i ], i, obj[ i ] ); 40 41 if ( value === false ) { 42 break; 43 } 44 } 45 } 46 } 47 48 return obj; 49 },

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

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

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

投稿2016/03/16 12:49

Lhankor_Mhy

総合スコア36115

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2016/03/16 13:18

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

2016/03/16 13: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 があるので同じフォーマットと定義するわけにいかず、だからといって「一定以上」を定義する事もできず。 私には厳密に定義する事が出来そうにないですね。
guest

0

加工(かこう、processing)は、原材料に手を加えて製品を製作すること。

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

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

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

投稿2016/03/16 14:54

hirohiro

総合スコア2068

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

think49

2016/03/17 13:19

「加工食品」という言葉があります。 例えば、「魚」を原料として加熱⇒練ると「かまぼこ」になり、「加工食品」とされます。 しかし、「魚」を包丁で切っただけの「刺身」は「生鮮食品」とされます。 http://www.maff.go.jp/j/fs/f_label/f_fresh/ どちらも加工していますが、単純にカットしただけでは「加工食品」と見なされません。 あくまで個人的な考えですが、JavaScript に例えると次のようになるのかなと思っています。 ・jQuery.each は原料(入力データ)には手をつけず、そのまま出力しているので「加工」ではない ・jQuery.map は原料(入力データ)を元に値を変化させて出力しているので「加工」である ・Array.prototype.indexOf は原料(入力データ)を元にindex値を算出するが、原料そのものには手をつけていないので「加工」ではない(例えば、魚のうろこの数を数えて記録を提出しているようなイメージ)
hirohiro

2016/03/17 13:49 編集

> しかし、「魚」を包丁で切っただけの「刺身」は「生鮮食品」とされます。 読んで字のごとくというか、工程、工夫を加える事が加工だと思いますので、 刺身は「加工食品」には分類されないかも知れませんが、魚を加工した何かのはす。 魚を処理したものが刺身だというと違和感があります。 一般的には、完成品が出力される処理工程を加工と呼称するように思います。 しかし魚を例にすると、 1.下ごしらえした状態は処理でも、加工でも違和感なさそうです。 2.血抜きも処理したとも加工したとも言えると思います。 3.計量しただけでは、加工とは言いませんが、計量(処理)済みとは言えそうです。 RyogaK氏は1,2のような加工途上の状態も、処理からの出力であれば加工であると分類しているのだと思います。 > 単純にカットしただけでは「加工食品」と見なされません。 「食品」に加工されて後、それ以上の加工処理が入っていないという解釈でどうでしょう? > JavaScript に例えると次のようになるのかなと思っています。 ここ以下の解釈に同意です。読み直してみるとRyogaK氏も同じような事を言っているように見えます。
think49

2016/03/29 10:19

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

0

ベストアンサー

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

投稿2016/03/16 11:57

Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

think49

2016/03/16 12:05 編集

「具体的な定義」が欲しいと思っています。 言われてみれば確かに「入力データを元に」とありますが、Array.prototype.indexOf も「入力データを元に処理をして出力」しています。 「入力データに改変処理を加え、入力データと同じフォーマットで出力 === 加工」ならjQuery.mapが「加工」でjQuery.each, Array.prototype.indexOf が「処理」と定義する事ができます。 ただ、どこかにドキュメントがあるなら知りたいとも思います。
Stripe

2016/03/16 12:13

「処理」はとても広い意味の言葉です。 当然、「データを出力する処理」というのもあります。 そもそも「加工」や「処理」という言葉を言い出したのが誰なのかを考えてください。 そこには具体的な定義もドキュメントもありません。
think49

2016/03/16 12:57

元の質問者が根拠を持っていない事は理解しているのですが、「jQueryのみならず、これらの操作はプログラミング言語の間で Optional とともに語られます」という物言いから何がしかの根拠となるものから出ているのかもしれないと思いまして…。 私の考えすぎだったのでしょうか。
Stripe

2016/03/16 13:07

ちなみに、Optionalの意味は分かってますか?
think49

2016/03/16 13:41 編集

検索してJava界隈の用語だという事までは理解しましたが、ほとんど理解しておりません…。
Stripe

2016/03/16 13:58

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

2016/03/16 23:49

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

2016/03/29 10:20

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問