2020年04月14日

JavaScript プライベートメンバとアクセサーメソッドの実装例

definePropertyを使わない例
// プライベートメンバの定義例
'use strict';

// 点数を保持する
var Score = function(){
// プライベートプロパティ
var _val; // this._valではない!

var _chkVal = function(val){
return (typeof val === 'number' && 0 <= val && val <= 100);
}
// プライベートメンバにアクセスするためのメソッド(特権メソッドと呼ぶ)。
// this.を付けて記述する。
this.setVal = function(arg){
if(_chkVal(arg)){_val = arg;}
}
this.getVal = function(){
return _val;
}
}

var scr1 = new Score();
scr1._val = 50; // プロパティは追加できるが、getVal()からは参照しない。
scr1.setVal(99);
console.log(scr1.getVal());
definePropertyによるアクセサーメソッド
// definePropertyによるアクセサーメソッドの例
'use strict';

// 点数を保持する
var Score = function(){
// プライベート変数
var _val;

var _chkVal = function(val){
return (typeof val === 'number' && 0 <= val && val <= 100);
}
Object.defineProperty(
this,
'val',
{
get: function(){
return _val;
},
set: function(arg){
if(_chkVal(arg)){
_val = arg;
}
},
}
);
}

var scr1 = new Score();
scr1.val = 88;
console.log(scr1.val);

var scr2 = new Score();
scr2.val = -50; // チェックで弾かれる
console.log(scr2.val); // undefined
definePropertiesによるアクセサーメソッド
// definePropertiesによるアクセサーメソッドの例
'use strict';

// 点数を保持する
var Score = function(){
// プライベート変数
var _val;

var _chkVal = function(val){
return (typeof val === 'number' && 0 <= val && val <= 100);
}
Object.defineProperties(
this, {
val: {
get: function(){
return _val;
},
set: function(arg){
if(_chkVal(arg)){
_val = arg;
}
},
},
// 2つめ以降のアクセサーを記述する。
}
);
}

var scr1 = new Score();
scr1.val = 77;
console.log(scr1.val);

タグ:JavaScript
posted by Hiro at 22:40| Comment(0) | プログラム

SQL Server テーブル出力バッチ

SQL Serverで、テーブルをCSVで出力するバッチです。
指定テーブルの全レコードを対象とする場合は bcp %DBNAME%%TABLE% out ... とする。
rem SQL Server テーブル出力バッチ

rem 初期値セット
set DBNAME=[WORKDB].[dbo].
set TABLE=MyTable
set SQL="SELECT * FROM %DBNAME%%TABLE% WHERE MyColumn IS NOT NULL"
set OUTPUTDIR=C:\WORK\
set OUTPUTFILE=OUTPUT_%TABLE%.csv
set OUTPUTPATH=%OUTPUTDIR%%OUTPUTFILE%
set TERMINATOR=,
set SERVERNAME="myserver"
set LOGINID="loginid"
set PASSWORD="123456789"

rem csvファイル出力実行
bcp %SQL% queryout %OUTPUTPATH% -c -t %TERMINATOR% -S %SERVERNAME% -U %LOGINID% -P %PASSWORD%

pause
テキストファイルをもとにテーブルを一括でCSVへ出力する場合は、以下のようにします。
rem SQL Server 一括テーブル出力バッチ

rem 初期値セット
set DBNAME=[WORKDB].[dbo].
set OUTPUTDIR=C:\WORK\
set TERMINATOR=,
set SERVERNAME="myserver"
set LOGINID="loginid"
set PASSWORD="123456789"

rem csvファイル出力実行(テーブル一覧を書いたTableList.txtを用意しておく)
for /f %%i in (TableList.txt) do (
if %%i==dummystring (
rem 無視文字列
) else (
bcp "SELECT * FROM %DBNAME%%%i WHERE MyColumn IS NOT NULl" queryout %OUTPUTDIR%OUTPUT_%%i.csv -c -t %TERMINATOR% -S %SERVERNAME% -U %LOGINID% -P %PASSWORD%
)
pause
)

pause

posted by Hiro at 19:14| Comment(0) | プログラム

JavaScript オブジェクトの継承について

// プロトタイプオブジェクトの定義方法/オブジェクトの継承について
'use strict';

var Person = function(name, birthday, address){
this.name = name;
this.birthday = birthday;
this.address = address;
}

// オブジェクトリテラルでプロトタイプオブジェクトを定義する。
Person.prototype = {
getName : function(){
return `名前は${this.name}です。`;
},
getAddress : function(){
return `居住地は${this.address}です。`;
}
}

// 静的プロパティ
Person.Company = 'ABC Corp.';
// 静的メソッド
Person.Greeting = function(){
return 'こんにちは!';
}

// インスタンス生成
var p1 = new Person('太郎','2005/08/20','東京都');
var p2 = new Person('花子','2008/10/05','大阪府');

console.log(p1.getName());
console.log(p2.getAddress());

// p2インスタンスのみメソッド追加
p2.getBirthday = function(){
return `誕生日は${this.birthday}です。`;
}

// console.log(p1.getBirthday()); // エラー
console.log(p2.getBirthday());

// プロトタイプチェーンによるオブジェクトの継承
var BaseballPlayer = function(name, birthday, address, team, career){
Person.call(this, name, birthday, address); // this(BaseballPlayerのインスタンス)を使ってPersonコンストラクタを呼び出す
this.team = team;
this.career = career;
}

BaseballPlayer.prototype = new Person(); // Personのインスタンスをセットする
BaseballPlayer.prototype.getTeam = function(){
return `チーム名は${this.team}です。`;
};

var bp1 = new BaseballPlayer('鈴木三郎','1980/01/30','兵庫県','ナンチャラズ',5);
console.log(bp1.getAddress()); // Personのメソッド
console.log(bp1.getTeam()); // BaseballPlayerのメソッド

// ダミーのオブジェクト
var Dummy = function(){};

// prototypeを上書き
BaseballPlayer.prototype = new Dummy();
console.log(bp1.getTeam()); // インスタンスには影響なし(インスタンス生成時のプロトタイプチェーンを保持する)。
タグ:JavaScript
posted by Hiro at 00:04| Comment(0) | プログラム