Vixual / 122 posts / tags / 62 comments / feed / comments feed /
Search:

Posts Tagged ‘coding’


我知道 OOP 比較看得懂程式在寫什麼,我也知道模組化比較好維護,但是寫程式要花比較久的時間,因為程式流程要再重新思考、分散、組合…

而寫好的物件往往要在重覆使用時才會覺得值得,要是時間趕的話,真的會很想含糊帶過!!

所以~以物件導向寫程式真的需要堅持!!

P.S. 我主要使用的語言是 Perl & Javascript

使用 Javascrip 的框架來開發網頁的程式可以加快開發的速度,其中 jQuery 也是頗受歡迎的一員。

不過目前可以買得到的 jQuery 中文書籍實在寥寥可數,以下是最近閱讀「網頁設計-愛上jQuery」這本書的心得及評論 (作者是羅子洋)。

心得 & 優點

缺點

雖然上述的缺點不少,但做為入門書籍,這本書對讀者也是很有幫助的,畢竟任何程式語言要學得熟練,都要靠不斷的經驗累積。

這本書我打 75 分,作者的另一本著作「jQuery UI & Plugins」我也會去買來閱讀。

參考網頁

轉載自: PHPChina


近來接受 BBT 的培訓,做一個投票系統。系統程式碼倒不是很難,但是我的時間主要花費在了研究字符集和編碼上面。MySQL 和 Apache 兩個系統的編碼(字符集)問題讓我費勁腦筋,吃盡苦頭。網上對這些問題的解決比較零散,比較片面,大部分是提供解決方法,卻不說為什麼。於是我將這幾天收穫總結一下,避免後來者再走彎路。這篇文章對 PHP 編寫有一點幫助(看完你就知道,怎樣讓你的 PHP 程式在大部分空間提供商的伺服器裡顯示正常),但是更多幫助在於網路伺服器的架設和設置。
繼續閱讀 »

我看過太多人都把四捨五入的問題看成是「字串」來處理,實際上,如果把四捨五入做為「數學」來解的話,程式大概只要幾行即可解決。

以四捨五入取整數的例子來講,其原理就是: 任何數值+0.5 再取整數

但要注意的是,當四捨五入遇到「負數」時,處理的方式就會變成「五捨六入」,這是因為中間數要往數值大的那邊進位的緣故。所以加上了負數的處理,程式至少又多了一行:
繼續閱讀 »

HTML

<head>
<meta http-equiv=refresh content="0;url=http://host.domain.tld/path/to/">
</head>

JavaScript

<script language="JavaScript">
<!--
  window.location.href = "http://host.domain.tld/path/to/";
//-->
</script>

PHP

<?php
  header("Location: http://host.domain.tld/path/to/");
?>

(轉址前不可有任何資料輸出)

Perl

#!/usr/bin/perl -w
print "Location: http://host.domain.tld/path/to/ \n\n";

(轉址前不可有任何資料輸出)

Perl - 使用 CGI 模組

#!/usr/bin/perl -w
use CGI qw/:standard/;
my $CGI = CGI->new();
print $CGI->redirect("http://host.domain.tld/path/to/");

(轉址前不可有任何資料輸出)

Cheat Sheet Roundup 是一個很棒的網站,內有作業系統、程式設計、資料庫、網頁設計…等 30 餘種相關的資料手冊可供下載(包含一些單頁的 Data Sheet 可以用來貼在自己的座位牆板上),對於設計師與相關資訊人員,都是很好的參考資料,強力推薦。

在國外有一些網站,專門存放一些程式碼的精華片段,寫程式如果遇到瓶頸,可以上來逛逛…

Coding

Regular Expression

轉載自: http://www.vcroad.net/ (棗子原創 wutao8@263.net)


看了下面的這篇文章,深有感觸,棗子碰到的問題也是我們大多數程式設計師的通病,也許我們大多數人都只是在做一些比較小型的軟件,對軟件運行的效率不在乎,就算對速度和效率在乎的也可能是一些在資料庫操作方面的。大家看完了,也許會有很多感想,但這只是我同意棗子的個人觀點。

繼續閱讀 »

轉載自: Neo’s Blog


今天大概把幾種常見的資料庫命名方式給整理了一下。

1.資料庫表單(Table)名稱:

單複數皆有人使用,如 products、product。

美國人命名比較喜歡依照口語習慣來用複數命名,知名的 OpenSource 軟體像 phpBB、OSCommerce、In-Link、pLog 皆是以複數命名。而 Moveable Type 則是少數使用單數名命的軟體,台灣人也是單數命名居多。

2.資料庫欄位名稱:

使用 MySQL 的 Opensource 軟體比常見整批性的加前綴(Prefix) 在欄位裡面,如 products 表單中的「產品名稱」,可能就會命名為「products_name」而 Microsoft SQL Server 則是以純欄位名稱居多,如產品名稱就直接取叫「name」了。

前綴的命名有「語意導向」跟「實用導向」二種,所謂語意導向以口語的習慣來命名,像 products 是產品的集合(複數),裡面的每個產品是單數,所以用產品名稱為例就是「product_name」。

而實用導向常見的就是以表單名稱做為前綴,如前例在 products 裡的產品名稱欄位就會命名為「products_name」,如此做的好處是程式會非常清楚每個欄位是從哪個表單抓出來的。但是缺點是在程式裡面語意不清,看起來會很不習慣。

然而大部份的欄位前綴字元還是以語意導向為主,若要使用實用導向,最好表單名稱採用單數(如 Moveable Type),否則像 OSCommerce 的全員複數,感覺程式在用名字就很奇怪,如程式明明就是只抓一筆產品名稱出來,看到 products_name 就覺的既不是複數,而且文法上也不通,意義上反而比較像 product’s name。

3.大小寫:

Microsoft 的命名方式喜歡單字第一個字母大寫,如 OrderDetail。而 MySQL 比較常見全部小寫,單字中間加底線的命名方式,如 order_detal。這根資料庫的字元大小寫敏感度預設值有關,MS SQL Server 預設是大小寫不分,MySQL 則是大小寫視為不同欄位,所以統一小寫比較不容易出錯。

轉載自: 愛德華日誌


這不是一篇教你如何在網頁中應用 JavaScript 的教材。這是一篇讓你明瞭看似簡單的 JavaScript,其實其核心語法功能強大。我將在這篇文章中說明 JavaScript 物件導向的特性,並說明如何透過這些特性,達到傳統程式語言 (C++/Java) 所難以完成的功能。

Everything is Object in JavaScript

開宗明義:在 JavaScript 中任何東西都是物件:變數是物件、函式是物件,常數也是物件。證明方式:

alert (typeof('abc'));
alert (typeof(123));
var ary = [123, "abc"];
alert (typeof(ary));

上面的 typeof 會顯示物件資料型態。得到結果分別是 string, number, object。

Create Objects in JavaScript

既然任何東西都是物件,那建立物件的方法就多了。直接看個例子:

var main = new Object;     // 建立新物件
main.x = 123; // 設定物件成員變數(屬性)之一
main["y"] = "XYZ"; // 設定物件成員變數(屬性)之二
alert(main["x"]); // 取得物件屬性並輸出
alert(main.y);

可以看到在 JavaScript 中,main.x 與 main["x"] 這兩種語法是通用的。其實在其他語言中,這兩種表示法的語意並不相同。我稍後再作說明。

List All Members in an Object

這是 JavaScript 的必殺技,使用 JavaScript 的人務必要學會這個技巧。底下函式可以傳回一個物件的所有成員的字串表達式,包括物件中的屬性及方法。在物件導向程式設計中,這種技術叫 reflection。

function listMember(main) {
  var s = "";
  for( key in main )  // 使用 in 運算子列舉所有成員
  s += key + ": " + main[key] + "\n";
  return s;
}

範例碼中的 key 會對應到物件中的屬性名稱,如 “x” 或 “y”,而 main[key] 則對應到屬性值。

說這項技巧是必殺技的原因是,你可以透過這項技巧,將物件封裝的黑箱打開來,看看裡面藏有什麼東西。我常用這項技巧來看看 IE 與 Mozilla 的 Dom 物件模型有何不同。試試看下面呼叫範例,就可以知道這項技巧的強大了:

var ary = [123, "abc"];
alert (listMember(ary));
alert (listMember(document.location));

Construct Object with Initial Value

要在建立物件的同時指定物件初始值,必須先透過 function 建立一個「原型物件」(或稱為 constructor),再透過 new 運算子建立新物件。例如以下程式碼會建立一個二維陣列的原型,再產生一個新的二維物件。

function Array2DVar(x,y) {  // 定義二維陣列原型
  this.length = x;
  this.x = x;  // x 維度長度
  this.y = y;  // y 維度長度
  for(var i = 0; i < this.length; i++)  // 初始各元素值為 null
  this[i] = new Array(y);  // this 代表物件本身
}

var a2dv = new Array2DVar(10, 10);  // 建立新的 10*10 的二維陣列
a2dv[1][3] = "ABC";  // 設定二維陣列元素值
a2dv[2][6] = "XYZ";
a2dv[9][9] = 1000;

alert( a2dv[1][3]);  // 取得二維陣列元素值,並顯示出來
alert( a2dv[2][6]);
alert( a2dv[9][9]);

Initial Array Object

在 JavaScript 中陣列也是物件 (其實近代多數語言中陣列也都是物件,只有像 C 或 Assembly 這類古老的語言才不把陣列看成物件),因此也可以用 constructor 的語法來建構。當然 JavaScript 還提供了 [] 語法,以更方便建構陣列,範例如下:

a = new Array("abc", "xyz", 1000); // constructor 語法,或
a = ["abc", "xyz", 1000]; // 陣列標準語法

陣列的元素可以是簡單的資料、其他物件,或是函數。舉個例子來在陣列裡面放函式:

b = [ // 使用函式作為陣列元素
  function () { alert("這個好玩!") },
  function () { alert("再按一次離開!") },
  function () { alert("再來一次!") },
  function () { alert("最後一次!") }
];

for (var i = 0; i < b.length ; i++)
b[i]();

最後一個 for 迴圈是個有趣的應用。由於 b 陣列中現在存放的所有元素都是函式,因此我們可以對 b 的每個元素進行呼叫。

Object as Association Array

關聯陣列 (Assocation Array) 又稱作 Map 或 Dictionary,是一種物件容器,其中可以放置許多的 key-value pair,以存取子物件。在JavaScript 中,物件本身就可以作為關連陣列。以關聯陣列的方式初始化物件的範例如下:

obj1 = {"a" : "Athens" , "b" : "Belgrade", "c" : "Cairo"};
alert(obj1["a"]);  // 顯示 Athens
obj2 = {
  name: "Edward",
  showName: function() { alert(this.name); }  // 使用函式作為物件屬性
}
obj2.showName();  // 顯示 Edward
obj2.age = 23;  // 屬性可以動態加入

其 中 obj1 儲存了三個子元素,其鍵 (key) 為 “a”, “b” 與 “c”,而值 (value) 為 “Athens”, “Belgrade” 與 “Cairo”。obj2 中 showName 鍵所對應的值為 function,因此 obj2.showName() 即為函式呼叫。

Object as Return Value

雖然 Javascript 的函式只能傳回一個變數,但您卻可以將傳回值設定為物件,達到傳回 1個以上變數值的效果

function a () {
  return [32, 17];
}
b = a();
alert( b ); // 或
alert(a());
function pixel () {
  return {"x": 32, "y":17};
}
point = pixel ();
alert (point.x + "\n" + point.y);  // 或
alert (pixel().x + "\n" + pixel().y);

Delegation Function Object

函式也是物件,只是其中包含的是程式的邏輯。這項特性可拿來作為委任式的程式設計,亦即使用委任函式當作另一函式的參數:

function doloop(begin, end, func) {  // 這個函式是個 iterator
  for (var i = begin; i < end; i++) {
    func(i);
  }
}
function func1(i) {  // 印出 ** n **
  document.writeln("** " + i + " **<br>");
}
doloop(1, 10, func1);  // 印出 10 行 ** n **
doloop(20, 29,
  function(i) {  // 印出 10 行 ## n ##
    document.writeln("## " + i + " ##<br>");
  }
);

Object = Properties + Behaviors

古有明訓:程式 = 資料結構 + 演算法。而物件是建構程式的基本單位,自然的具有相同的性質。物件除了有屬性 (property),也可具有操作 (behavior),也就是函式。

假如我們要使用一維陣列來模擬二維陣列,那麼就無法使用 ary[x][y] 這種表示法來設定或取得陣列成員。不過我可以定義一個 set 方法來設定成員變數,而以 get 方法來取得成員變數值。原型函式定義如下:

function Array2D(x,y){  // 以一維陣列模擬二維陣列的原型物件
  this.length = x * y;  // 陣列總長
  this.x = x;  // x 維度長度
  this.y = y;  // y 維度長度
  for(var i = 0; i < this.length; i++)  // 初始各元素值為 null
    this[i] = null;
  this.get = function(x,y){  // 成員函式:取得陣列第 [x,y]個元素值
    return this[x*this.x + y];
  }
  this.set = function(x,y,value){  // 成員函式:設定陣列第 [x,y] 個元素值
    this[x*this.x + y] = value;
  }
}

我們接著來使用它:

var a2d = new Array2D(10, 10);  // 建立新的「二維」陣列

a2d.set(1, 3, "ABC");  // 設定「二維」陣列元素值
a2d.set(2, 6, "XYZ");
a2d.set(9, 9, 1000);

alert( a2d.get(1,3) );  // 取得「二維」陣列元素值,並顯示出來
alert( a2d.get(2,6) );
alert( a2d.get(9,9) );

Member Function Outside of Constructor

我們也可以將物件成員函式寫於原型物件之外。以下的 Array2D 物件與上一個範例中的 Array2D 物件有相同的作用,只不過這次是寫在原型物件之外。

function Array2D(x,y){  // 以一維陣列模擬二維陣列的原型物件
  this.length = x * y;  // 陣列總長
  this.x = x;  // x 維度長度
  this.y = y;  // y 維度長度
  for(var i = 0; i < this.length; i++)  // 初始各元素值為 null
    this[i] = null;
  this.get = Array2DGet;  // 用這種方式把成員函式掛進來
  this.set = Array2DSet;
}

function Array2DGet(x,y){  // 成員函式:取得陣列第 [x,y] 個元素值
  return this[x*this.x + y];
}

function Array2DSet(x,y,value){  // 成員函式:設定陣列第 [x,y] 個元素值
  this[x*this.x + y] = value;
}

Dynamic Object Function

這裡說明如何為一個已定義物件,動態的加上其他操作的方法。

如果一物件已定義完成,而您也使用它來建立了新的物件,這時候您想為原型物件增加新的操作 (而不修改原型物件的原始碼),讓所有該物件的複本都能使用該操作,該如何達成呢?方法是使用物件的 prototype 屬性。以下這個例子,為 Array 這類 Object 在執行期加入一個 max 方法,以取得陣列元素之最大值 (修改自微軟 jscript.chm之範例):

function array_max(){  // 定義求取 Array 最大值之函式
  var i, max = this[0];
  for (i = 1; i < this.length; i++){
  if (max < this[i])
    max = this[i];
  }
  return max;
}
Array.prototype.max = array_max;  // 在 Array 原型中加入 max 函式

上面的程式碼,首先建立一個 array_max 方法,以求取陣列之最大元素。接著將這個方法設定給 Array 原型物件。

var x = new Array(1, 2, 3, 4, 5, 6);  // 透過 Array 建構子建立一陣列,想求取 x 中某一元素之最大值
var y = x.max( );  // 取得 x 之最大元素

Dynamic Mix in

假如物件 dynamic 有 method1, method2 兩個函式;而另一物件 main 有 methodA 及 methodB 兩個函式。現在我想把 dynamic 的所有特性 (feature) 匯入到 main 中,我們可以在 main 中加上一個 imports 函式:

function main(){  // main 之建構子
  // ...
  this.imports =
    function (object) {
      if( typeof object == "object")
        for( value in object )
          this[value] = object[value];
    }
  // ...
}
obj = new main();
main.imports(new dynamic());  // 匯入 dynamic 物件之所有功能

這個 imports 函式可以動態的為 main 加上另一物件的所有操作。這種 Mix in 的功能可是 C++/Java 的 static type 語言所望塵莫及的。