クラスベースのオブジェクト指向しか理解できない人のためのJavaScript

昔、JavaScript を本格的に使おうとしたときに、僕はjsをこういうふうにとらえていました。今でもそうなんだけど。
別のサイトで書いたものですが、せっかくプログラミングブログ立ち上げてるので、もう一度このブログにも書いておこうっと

はじめに

このページはタイトルにあるとおり、JavaScriptを使おうとしてるんだけど、
クラスの概念が頭から離れなくて、JavaScriptにおけるオブジェクトをうまく扱えなくて
困っている僕みたいな人のために書きました。
だから、ぶっちゃけそれ以外の人には役に立たないですw

JavaScriptのオブジェクト指向についての解説は、他の優秀でわかりやすいサイトがたくさんありますが、
僕は、情けないことにそれでも理解できなくて数日間格闘しましたw
とりあえずは、オブジェクト指向で書いて動くレベルでの書き方は理解したのですが、
未だにクラスの概念が頭から離れず、多分JavaScriptならではの書き方ではないような気がしますw

よって、ここではクラスの概念を捨てきれない人向けに「とりあえず動くコードはこうだ!!」
という解説をしています。なのでJavaScriptに精通されてる方は怒らないで大目に見てくださいねw
また、基本的でセオリーなことや、コンストラクタとかプロトタイプとかプロトタイプチェーンとかスコープチェーンとか、
そういうのは、ここでは特に説明しません。ググってくださいw 他の優秀でわかりやすいサイトがたくさんあります。
あくまでも、クラスの概念を持ったままでもとりあえず動くコードを(ry

それでは解説いってみましょう。

 

その1 クラスみたいなのを作ってみよう

JavaScriptにクラスはありません。でもきっとクラスの概念を捨てきれない人は、次のソースがクラスのように見えてしまうはず。


//まるでクラスのよう。
function hogeCls() {

        // まるでプロパティ(メンバ変数)のよう。
        // 必ず「this.プロパティ名」とする。
        // var hogeProp = ''; とするとうまくいかないよ。

        this.hogeProp = '';
        

        // まるでメソッド(メンバ関数)のよう。
        // 必ず「this.メソッド名 = function(){}」とする
        // 「function メソッド名(){}」とか
        // 「var メソッド名 = function(){}」とするとうまくいかないよ。

        this.hogeFunc = function() {
                //プロパティへのアクセスは「this.プロパティ名」で。
                alert(this.hogeProp);
        }
}

クラスベースの言語だと (本当はJavaで書きたいけど、ぼくはPHPerなので)


//クラス
class hoge_cls {

        //プロパティ
        public $hoge_prop = "";

        //メソッド
        function hoge_func() {
                echo $this->hoge_prop;
        }
}

ですね。

その2 インスタンス化みたいなのをしてみよう

JavaScriptではインスタンス化じゃなく、なぜかコンストラクタと言うみたいです。まあ細かいことは置いといてw

//インスタンス化みたいなやつ(コンストラクタ)
hogeObj = new hogeCls();

//クラスみたいなやつ
function hogeCls() {
        this.hogeProp = '';
        
        this.hogeFunc = function() {
                alert(this.hogeProp);
        }
}

クラスベースの言語だと

//インスタンス化
$hoge_obj = new hoge_cls();

//クラス
class hoge_cls {
        public $hoge_prop = "";

        function hoge_func() {
                echo $this->hoge_prop;
        }
}

ですね。

その3 プロパティにアクセスしたり、メソッドを呼びだそう

プロパティとメソッドの使い方は、クラスベースの言語と違いはありません。

//インスタンス化みたいなやつ(コンストラクタ)
hogeObj = new hogeCls();

//プロパティに値をセット
hogeObj.hogeProp = '働いたら負けかなと思ってる';

//メソッドを呼ぶ
hogeObj.hogeFunc();


//クラスみたいなやつ
function hogeCls() {
        this.hogeProp = '';
        
        this.hogeFunc = function() {
                alert(this.hogeProp);
        }
}

クラスベースの言語だと

//インスタンス化
$hoge_obj = new hoge_cls();

//プロパティに値をセット
$hoge_obj->hoge_prop = '働いたら負けかなと思ってる';

//メソッドを呼ぶ
$hoge_obj->hoge_func();


//クラス
class hoge_cls {
        public $hoge_prop = "";

        function hoge_func() {
                echo $this->hoge_prop;
        }
}

ですね。

その4 継承みたいなのをしてみよう

JavaScriptでは継承はありませんが、プロトタイプというのがあります。でもきっとクラスの概念を捨てきれない人は、継承じゃん!!と思うはずw

//継承みたいなやつ(プロトタイプ)
hogeCls.prototype = new fugaCls();

//インスタンス化みたいなやつ(コンストラクタ)
hogeObj = new hogeCls();

//fugaClsオブジェクトのプロパティに値をセットしてみる。
hogeObj.fugaProp = '働いたら負けかなと思ってる';

//fugaClsオブジェクトのメソッドを呼んでみる。
hogeObj.fugaFunc();


//クラスみたいなやつ
function hogeCls() {
        this.hogeProp = '';
        
        this.hogeFunc = function() {
                alert(this.hogeProp);
        }
}

//もう一個クラスみたいなやつ
function fugaCls() {
        this.fugaProp = '';
        
        this.fugaFunc = function() {
                alert(this.fugaProp);
        }
}

クラスベースの言語だと

//インスタンス化
$hoge_obj = new hoge_cls();

//継承元のプロパティに値をセット
$hoge_obj->fuga_prop = '働いたら負けかなと思ってる';

//継承元のメソッドを呼ぶ
$hoge_obj->fuga_func();


//クラス
class hoge_cls extends fuga_cls {
        public $hoge_prop = "";

        function hoge_func() {
                echo $this->hoge_prop;
        }
}

//もう一個クラス
class fuga_cls {
        public $fuga_prop = "";

        function fuga_func() {
                echo $this->fuga_prop;
        }
}

ですね。

その5 おまけ 関数の中に複数の関数を定義する

関数の中に複数の関数を定義して使います。うーん。何かに役立つかも知れませんw
僕はテーブルタグを生成するための一連のオブジェクトをこの方法で一つにまとめました。

//インスタンス化みたいなやつ(コンストラクタ)
wrapObj = new wrap();

//fugaClsオブジェクトのプロパティに値をセットしてみる。
wrapObj.hogeObj.fugaProp = '働いたら負けかなと思ってる';

//fugaClsオブジェクトのメソッドを呼んでみる。
wrapObj.hogeObj.fugaFunc();


//複数の関数を一つにまとめる
function wrap() {
        //継承みたいなやつ(プロトタイプ)
        hogeCls.prototype = new fugaCls();

        //インスタンス化みたいなやつ(コンストラクタ)
        this.hogeObj = new hogeCls();        


        //クラスみたいなやつ
        function hogeCls() {
                this.hogeProp = '';
                
                this.hogeFunc = function() {
                        alert(this.hogeProp);
                }
        }

        //もう一個クラスみたいなやつ
        function fugaCls() {
                this.fugaProp = '';
                
                this.fugaFunc = function() {
                        alert(this.fugaProp);
                }
        }
}


 

 

終わりです。

ご感想や「JavaScriptとしてのオブジェクト指向の解釈はこれじゃ…」ではなく「こういう場合やばいよ。動き変になるよ。」
レベルのご指摘がございましたら以下までお願いします。

twitter @tsugist

SQL Server でのリミット句っぽいもの

僕は、ガチのWeb系じゃなくて、業務アプリをWebで作ってる程度なので、ページャを作る機会はほとんどなく、MySQLなどでよく使われるLimit句っぽいSQLを使うことがめったにない。

すぐに忘れるだろうからメモ。

今日仕事で使う場面に遭遇した SQL Server  で次のようなやり方があった。

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER(ORDER BY CHUMON_NO, TOIAWASE_NO) AS NARABIJUN
    , *
  FROM CHUMON 
) as CHUMON
WHERE NARABIJUN BETWEEN 101 AND 200

SQL Server 2012 以降は次のSQLが使えるらしい。古い古い SQL Server 使ってるから試せてない。

SELECT *
FROM CHUMON
ORDER BY CHUMON_NO, TOIAWASE_NO
OFFSET 101 ROWS FETCH NEXT 100 ROWS ONLY

 

2012より前は、「何番目から何番目まで」、 2012以降は、「何番目から何個」って違い。

どっちが使いやすいのだろうか。

 

PHP – NetBeans – XDebug で、ブレークポイントが効かない。

タイトルに書いたとおり、ブレークポイントが効かない現象が発生してて、2日も潰してしまった。

解決したのでブログに書きます。

まあ、僕と同じミスをする人がいるのかどうかですがw 万一同じ境遇の人がいたら試してみて。

※OSは Windows 10 です。

大抵の人は以下で解決する。

php.ini の最後に次の設定を追加し、Apache再起動。

 

[XDebug]
zend_extension = D:\xampp\php\ext\php_xdebug-2.5.1-5.6-vc11.dll ;←ココはもちろん各自のパスで
xdebug.profiler_enable=1
xdebug.remote_enable=1

 

 

僕の場合はなぜか解決しなかった。

ググって、5ページ分くらいの検索結果を全部クリックして、全部試してみたけどダメだった。

htdocs にある xammp の index.php にブレークポイントをおいて実行すると、ちゃんとそこで止まったので、Apacheで仮想ディレクトリはダメなのかと思って NetBeans の設定を見なおした。(開発中のソースは htdocs 外にあるので仮想ディレクトリにしてある。)

仮想ディレクトリやめて htdocs 内にシンボリックリンク貼ろうかなと思ったけど、もう一度 NetBeans の設定を見なおしてみる。

ついに解決

パス・マッピングのサーバーパス、プロジェクトパスが入っていたので、削除するとブレークポイントが効くようになりました。これは、どこかのサイトを見て設定した覚えがありますが、僕のと環境が違ったのでしょう。XAMMPを使ってローカルで実行する場合は、ここの設定はいらないようです。

シンプルなC言語の統合開発環境を見つけたのでインストールしてみた。

実は、僕はC言語はまったく書いたことないですw

子供のころはゲームの雑誌を見ると、「C言語で作っています。」というのを多く見てたので、

ずっとCを書くことは憧れだったのですが、なぜか今まで書いたことはありませんでした。このブログを始めることを機にCを始めます。

いまどきC言語のコンパイラってあるのかな?昔に探した時はC++のコンパイラで代用するとかいう記事を見たし

とか思いながらググると、「苦しんで覚えるC言語」というサイトが

シンプルなC言語の統合開発環境を公開していたので、インストールしてみました。※学習用です。

コンパイラは本物のCコンパイラ「Tiny C Compiler」をVC2010でビルドしたものを使用しているとのこと。

要するに生のCを体験できるんですね!!

サイトは、「苦しんで覚えるC言語」 http://9cguide.appspot.com/

説明が書かれています。http://9cguide.appspot.com/p_compiler.html

ダウンロードはこちら。http://9cguide.appspot.com/p_9cide.html

 

緑のボタンからダウンロード。わかりやすいですね。迷うことないです。

easycapture1

うん、わかりやすい、わかりやすいわかりやすい…リンク切れしとる!!!

easycapture2

窓の社にありました。http://forest.watch.impress.co.jp/library/software/gakucgengo/

easycapture3

ダウンロードした「easyidec.exe」を起動し、インストールします。

特に選択はないので、迷わずインストールできます。とりあえず「次へ」。

6

インストール。

5

あっという間に完了。キャプチャ取り損ねるくらいの速さでしたw

7

起動してみましょう。

8

初期画面です。

9

超初心者向けに、プロジェクトとかそういうのは気にしないで良いように作られています。勝手にプロジェクトが出来てますね。

10

入力支援などはないようです。

11

毎度恒例のコードを書きます。

#include <stdio.h>
void main(void)
{
	printf("hello world");
}

コードを実行するには、左上の「プログラム実行」をクリックします。
僕のような初心者でもまったく迷うことがまったくないですね。OKしましょう。
12
ちょっと見にくいです。
13

「hello world」の後に改行を入れてみましょう。


#include <stdio.h>
void main(void)
{
 printf("hello world\n");
}

Good!!!
15
あー生まれて初めてC書いたわwww

しばらく、C言語はこれを使ってみようと思います。

Visual Studio をインストールしてみた。

マイクロソフトのサイトへアクセス。

https://www.visualstudio.com/downloads/

一番左の Visual Studio Community をダウンロードしましょう。

easycapture1

ダウンロードができたら、実行してインストールします。

easycapture4

しばらく待ちましょう。

easycapture2

デフォルト(Default)でインストール(Install)します。

easycapture5

もしも、「許可しますか?」と聞かれたら、はいと答えておきましょう。

easycapture6

かなり待ちます。

easycapture7

待ってる間に、コーヒーでもどうぞ。

sgf01a201301020200

ケーキもどうぞ。

ppo_1000maicake_tp_v

おっと。タバコはだめですよ。僕はタバコが苦手なんです。

imgres

100ツイートくらいしてる間に完了してました。

「Restart Now」をクリックすると、PCが再起動する危険なボタンです。作業中のデータは保存してからクリックしましょう。

easycapture8

サインインしてくださいと言っています。僕はマイクロソフトのアカウントを持っているのでとりあえず、サインインします。そうでない人は「Not now, maybe later.」をクリックしましょう。

easycapture9

easycapture10

うーんこれはなんでしょう?前にインストールしたときこれあったっけ?「Not now, maybe later.」をクリック。

easycapture11

しばらく待ちます。

起動しました。英語です…

easycapture13

日本語パックをダウンロードします。

https://www.microsoft.com/ja-jp/download/details.aspx?id=48157

easycapture14

実行してインストールします。

easycapture15

2GBとか結構大きいですね。

easycapture16

しばらく待ちます。これもまあまあ長い…

easycapture17

終わりました。

easycapture18

メニューバーの Tool → Options → Environment → International Settings を開きましょう。English を 日本語 に変えて OK をクリック。

easycapture19

日本語になりました。

easycapture20

とりあえず、メニューの 新規→作成→プロジェクト→OK

メニューの 表示→ツールボックス

左にツールボックスが表示されるので、すべてのWindowsフォーム→Button を右のフォームにドラッグし、ボタンを配置。配置したボタンをダブルクリック。

easycapture22

そして、お約束のコードを書きます。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("hello world", "");
        }
    }
}

実行!

easycapture23

Hello world!

このブログの hello world ってことでよろしく!!

apple1-hello_world1

このブログでは、ちりも積もれば山となるとか、継続は力なりとか、下手な鉄砲も数うちゃ当たるとか、そういう信念のもと、広く浅くプログラミングをしていくつもりです。どうかよろしくお願いします。