代码中常见的命名问题

发现在代码命名中有一些常见的错误。我发现大多数是中国人犯这种错误,老外也有。

1. 设计模式后缀

比如 XXXFactory, XXXFacade, XXXObserver 等等,其实完全没有必要增加这种后缀。

2. 拼音命名法

这个我完全是带着个人偏见,相比英文,中文的表达能力更强,也就导致,名字的“意境”更多,更容易误解。倒不是因为使用拼音。

3. 词性错误

类大多数是名词,但如果是command模式,那类名可能会是动词,取决于类的本质行为。方法/函数通常是动词或者动宾短语。

4. 冗余

没有充分使用语言特性,如namespace、package等。比如 AlipayTradeService, AlipayWapTradeService…这种。好不环保哦。

基本上每当出现“重复”时,意味着代码需要重构或者精简了。

5. 直译法

比如,微信的“统一下单”,代码中是 ” unified ” – 统一, “order” – 下单。让我来推测一下这种名字的由来:

最开始,在线上支付和pos系统里有“收单”一说,英文用“acquire”,后来可能pos和线上合并了,也就是“统一”。其实似乎没有增加“统一”的必要。

本质上其实还是收单。

面向对象和充血/贫血模型

面向对象和是否使用充血模型,是两个概念,不存在冲突。

如果使用充血模型,你的代码读起来就好像:今天他来了,然后他死了。 – he.goto(Place,TrafficTool); he.died(DeadReason);

而贫血模型的话,读起来就像是:一辆大巴载着他来了,然后死神带走了他。 – bus.taketo(He,Place); death.takeaway(He);

“他”就是模型,在整个编程模型中怎么理解他至关重要,否则在开发团队里就存在混用的情况。用哪种模型完全取决于个人喜好。

一般充血模型比较适合逻辑不是很复杂,比如大多数都是单表,不存在复杂的关联的情况。贫血模型的使用范围比较广,用着也简单,但代码看起来多,而且读起来吞吞吐吐。毕竟充血模型需要在扩展时非常清楚合理地把行为定义到正确的模型上。

Discuz如何让帖子列表的标题显示帖子附件中的图片

Discuz的代码还是比较容易看懂的。关键是要找到需要改的地方。
第1步:
forumdisplay.php,用来准备要显示的帖子列表,然后用forumdisplay.htm作为显示模板。
找到forumdisplay.php中的:
$query = $sdb->query(“SELECT t.* FROM {$tablepre}threads t
        WHERE t.fid=’$fid’ $filteradd AND $displayorderadd
        ORDER BY t.displayorder DESC, t.$orderby $ascdesc
        LIMIT “.($filterbool ? $start_limit : $start_limit – $stickycount).”, $tpp”);

替换为:
$query = $sdb->query(“SELECT t.*,min(att.attachment) as attm FROM {$tablepre}threads t
        LEFT JOIN {$tablepre}posts p ON p.tid=t.tid
        LEFT JOIN {$tablepre}attachments att ON att.tid=t.tid
        WHERE t.fid=’$fid’ $filteradd AND $displayorderadd
        GROUP BY t.tid
        ORDER BY t.displayorder DESC, t.$orderby $ascdesc
        LIMIT “.($filterbool ? $start_limit : $start_limit – $stickycount).”, $tpp”);

意思很简单,把附件表中对应第一个附件选出来。这里有一点要注意,需要考虑附件类型,加一个图片类型的where条件即可。

第二步:
修改forumdisplay.htm
把第237行的:
<span id=”thread_$thread[tid]”><a href=”viewthread.php?tid=$thread[tid]&amp;extra=$extra”$thread[highlight]>$thread[subject]</a></span>
替换为:
<span id=”thread_$thread[tid]”><a href=”viewthread.php?tid=$thread[tid]&amp;extra=$extra”$thread[highlight]><image width=”100px” height=”100px” src=”attachments/$thread[attm]”/>$thread[subject]</a></span>
加个图片到链接里。

完成。

设置路径的vbs脚本

下面这段vbs代码会将当前的目录加入到路径,同时添加一个新的环境变量,值为当前路径

Set WshShell = WScript.CreateObject(“WScript.Shell”) 
 
Set Env = WshShell.Environment(“SYSTEM”) 
 
WScript.Echo Env(“Path”) 
currentDirectory = left(WScript.ScriptFullName,(Len(WScript.ScriptFullName))-(len(WScript.ScriptName)))
 
Env(“TODOR_BASE”) = currentDirectory

currentPath = Env(“Path”)
pos = InStr(currentPath,currentDirectory)
if pos=0 then
    Env(“Path”) = currentPath & “;” & currentDirectory
end if

WScript.Echo “Setup successfully!”

递归生成目录文件列表

很早前在学校时候写的一个生成目录文件列表的东西,因为那时候自己开了一个ftp服务器。

import java.util.Date;
import java.util.Arrays;
import java.io.*;

/**
* Time: 2003-12-23 20:46:42
*/
public class FileManager {
private String ListFilename = "@list.txt";
private String root;
private String updatetime;

public FileManager(String root) {
this.root = root;
updatetime=new Date().toString();
}


private void getList(String dir) {
File tmp = new File(dir);
File[] files = tmp.listFiles(new ffilter());
File[] dirs = tmp.listFiles(new dfilter());

if (files.length != 0) {
writeListFile(files);
}
if (dirs.length != 0) {
for (int i = 0; i < dirs.length; i++)
getList(tmp.getPath() + "/" + dirs[i].getName());
}
}

private void writeListFile(File[] files) {
FileWriter f = null;
String parent = files[0].getParent();
try {
int size;
f = new FileWriter(parent +"/"+ListFilename);
f.write("【列表最后更新时间】"+" :"+updatetime);
f.write(13);
f.write(10);
f.write("【欢迎分享我的收藏】,enjoy!");
f.write(13);
f.write(10);

//排列顺序
Arrays.sort(files);
for (int i = 0; i < files.length; i++) {
f.write(files[i].getName());
size = ((int) files[i].length()) ;
f.write(" 【size:"+size/1000+"k】");
f.write(13);
f.write(10);
}
f.flush();
f.close();
} catch (FileNotFoundException e) {
System.out.println("file not found");
} catch (IOException e) {
}
}

public void run() {
delete(root);
getList(root);
}

private void delete(String dir) {
File tmp = new File(dir);
File lfile = new File(dir + "/" + ListFilename);
lfile.delete();
File[] dirs = tmp.listFiles(new dfilter());

if (dirs.length != 0) {
for (int i = 0; i < dirs.length; i++)
delete(tmp.getPath() + "/" + dirs[i].getName());
}

}

public static void main(String args[]) {
/*      String dowhat = "list";
if (args[0] != null) Root = args[0];
if (args[1] != null) dowhat = args[1];
FileManager f = new FileManager(Root);
if (args[1] == "list")
f.getList(Root);
else if (args[1] == "delete") f.delete(Root);*/

FileManager f=new FileManager(args[0]);
f.run();
}
}

class ffilter implements FileFilter {
public boolean accept(File pathname) {
String name = pathname.getName();
return (pathname.isFile()) && (name.indexOf(".mp3") != -1);
}
}

class dfilter implements FileFilter {
public boolean accept(File pathname) {
return pathname.isDirectory();
}
}

moder – 算利息

用swt作了一个算利息的东东

moder

简单的div显示,隐藏例子

<script type=”text/javascript” language=”JavaScript”><!–
function HideContent(d) {
if(d.length < 1) { return; }
document.getElementById(d).style.display = “none”;
}
function ShowContent(d) {
if(d.length < 1) { return; }
document.getElementById(d).style.display = “block”;
}
function ReverseContentDisplay0(d) {
if(d.length < 1) { return; }
if(document.getElementById(d).style.display == “none”) { document.getElementById(d).style.display = “block”; }
else { document.getElementById(d).style.display = “none”; }
}

function ReverseContentDisplay(d) {
if(d.length < 1) { return; }
for(i=1;i<=3;i++){
var tmp = ‘block’+i;
if(d==tmp){
if(document.getElementById(d).style.display == “none”) { document.getElementById(d).style.display = “block”; }
else { document.getElementById(d).style.display = “none”; }
}else{
document.getElementById(tmp).style.display = “none”;
}
}
}
//–></script>

<a
onclick=”javascript:ReverseContentDisplay(‘block1’); return true;”
href=”#”>
[Bid 1]
</a>
<div
id=”block1″
style=”display:none;
border-style: solid;
background-color: white;
padding: 5px;”>

bLOCK 1
</div>
<br>
<a
onclick=”javascript:ReverseContentDisplay(‘block2’); return true;”
href=”#”>
[Bid 2]
</a>
<div
id=”block2″
style=”display:none;
border-style: solid;
background-color: white;
padding: 5px;”>

bLOCK 2
</div>
<br>
<a
onclick=”javascript:ReverseContentDisplay(‘block3’); return true;”
href=”#”>
[Bid 3]
</a>
<div
id=”block3″
style=”display:none;
border-style: solid;
background-color: white;
padding: 5px;”>

bLOCK 3
</div>