2014年10月29日 星期三

不要連環呼叫的原因

之前看clean code有看到不要做
a.b.c.d這種呼叫
那時候也不知道為何
最近在改code的時候新增了一些property
例如本來是直接access
public A as cA 但因為需要從不同的角度觀察A,需要A1與A2兩種跟A相關的property
改成
public property A1 as cA
  set(value as cA)
    ... 
    m_A = setOp1(value)
  end set
  get
     return getOp1(m_A)
  end get
end ppoperty

public property A2 as cA
  set(value as cA)
    ... 
    m_A = setOp2(value)
  end set
  get
    return getOp2(m_A)
  end get
end property

private m_A as cA

但因為有程式直接修改了A的元素
.A.B = newB 變成
.A1.B = newB 這麼做並不會呼叫
  set(value as cA)
    ... 
    m_A = setOp1(value)
  end set
只會呼叫
  get
     return getOp1(m_A)
  end get
這時候get出來的objet跟m_A是脫離的,對他修改並不會影響m_A
應修改為
dim _A1 = .A1
_A1.B = newB
.A1 = _A1
如此才能正確設定 .A1的value

2014年10月28日 星期二

用p4merge合併 -- setup 篇

git 好像是沒有內建合併器@@~

如果branch分支之後,master(parent branch)有被修改(新的commit)當要把branch合併到master中
在merge之前要先將branch切換到master(要合併到的)branch上
在git gui選local merge
合併有可能出現conflict的狀況
這時候就需要引導merge了
git會show出有conflict的地方
例如
v2
<<<<<<< HEAD
v3
=======
v2.1
v2.1.1
>>>>>>> v2

上面是master版本,下面是branch的內容
用git gui 不知道要怎麼跟他說到底要怎模合併,只知道檔案會被改成上面的內容@@~
只好選abort merge
google找到了p4merge這個合併器
http://www.perforce.com/downloads/Perforce/20-User
選擇P4V: Visual Client下載
安裝好之後還需要到 git bash設定
git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd '"C:\\Program Files\\Perforce\\p4merge" $BASE $LOCAL $REMOTE $MERGED'
有點小麻煩,重點是在git gui中,顯示conflict的地方案右鍵可以用mergetool,但卻疑似因為我的路徑有空格找不到...
只好在bash底下用 git mergetool來開了
開了之後她會show local跟remote的內容跟不一樣的地方
在最下面在編輯合併後的內容

利用git history找出程式被改壞的地方

之前一直聽過,前些陣子因為183的說明開始用
git是資料夾base的,要備份的話可以最白癡的直接複製資料夾
但這些日子除了天天commit,打打說明以外好像跟沒用git沒啥差別
直到昨天
話說最近因為要離職了準備把手上的工作ending一下
因為離職在即,改道比較晚,加上身體有點不舒爽
不知怎麼的就把之前寫好的東西改壞了!!~
哭哭,理性的trace code翻片所有可能出錯的地方完全找不到
這時候終於用上git了
查看版本的history可以比較之前版本跟現在的差異處
瀏覽了差異處一樣是沒有頭緒(但總比整個專案翻快得多了)
最後直接回覆成之前commit的版本,確認錯誤是在這次修改造成的(這個操作其實有點問題,應該要在想回復的點上建立新的branch再直接切過去,不然之後的修改都會不見@@~幸好有聽183的先備份了)
恩...的確是這次造成的
再回去check比較的code...終於找到唯一可能的修改
但當下還是不相信這個修改可能會有問題,把先前的版本貼回去之後,問題果然解決了!~鐵錚錚的事實啊!~只好再去思考到底哪裡寫錯了
原來是我用一個value去new一個object但是其實要用object去new才對啊!!!
dim obj2 as new obj(obj1.value)
改成
dim obj2 as new obj(obj1)
就OK了...因為也可以用value去new,但除了value以外其他的值都會是default...語法上正確,邏輯GG~

2014年10月16日 星期四

增加滑鼠控制性的雙螢幕設定方法

一言以蔽之,將螢幕的相對位置改成只有一個小交點,這個點就是連接兩個螢幕的隧道。
這條隧道開在主螢幕的左右下角最好,滑鼠最不會去的地方

[.NET]加入使用者控制項

使用者控制項是包含了UI的類別
可以在VS的UI設計介面中被加入
用使用者控制項和一些UI元件跟邏輯,避免Code的複製

操作方式
[建立使用者控制項]
  1. 專案>加入>使用者控制項
  2. 編輯控制項
      *使用者控制項的class須為public class,否則後續加入後會看不到控制項
  3. compile專案,產生.dll/.exe檔
[將控制項加入工具箱]
  1. 在工具箱中右鍵>選擇項目
  2. 在.net framework的Tab底下,選擇瀏覽
  3. 找到剛剛產生的.exe/.dll(在專案資料夾/bin/compile設定)加入
  4. 以命名空間(方案名稱)/名稱(control名稱)找到元件
  5. 在工具箱中即可找到元件