FrmMain.cs中存在问题

1. int i=0 设定为了全局常量且未在类顶部,出现问题时不好查找

i 属于常用临时变量,设定全局变量容易引起混乱

2.定义的全局变量但仅在一处方法中使用,定义全局变量过多

3.变量名及控件名等意义不明确又缺少注释,如顶部定义的全局变量

long length = ;
long loading = ;
private string oldPath = null;
private int random = ;
private int repeat = ;
private string quotaNum = null;

其他类似 timer1,timer2,l1,l2等等。。。

4. 存在多处重复或相似代码

如下面一段代码

for (int i = ; i < FrmLog.FileListOfLoginedUser.Count; i++)
{
if ((FrmLog.FileListOfLoginedUser[i].Path) == CurrentPath)
{
string itemName = FrmLog.FileListOfLoginedUser[i].ItemName;
string path = FrmLog.FileListOfLoginedUser[i].Path;
string[] itemArr = new string[];
itemArr[] = itemName;
itemArr[] = path;
itemArr[] = FrmLog.FileListOfLoginedUser[i].ItemType;
itemArr[] = FrmLog.FileListOfLoginedUser[i].FileSize.ToString() + "KB";
itemArr[] = FrmLog.FileListOfLoginedUser[i].UploadTime;
itemNameList.Add(itemArr);
}
}

在以下方法中多次调用而没有重构提取出来,日后返回值如有变动需要多处修改很容易混乱

void isSuccess(object iparam, object oparam)  Line : 在138-236 行

private void FrmMain_Load(object sender, EventArgs e) 465-520行

private void 删除ToolStripMenuItem_Click(object sender, EventArgs e)  710-778行

private void btnToParent_Click(object sender, EventArgs e)  返回到上一级 782-842行

private void ChangeListViewDisplayStyle(object sender, EventArgs e)  改变文件列表显示方式 867-907行

private void btnSearch_Click(object sender, EventArgs e)   点击搜索时  1325-1377

另外如下面一段代码,作用是为了检测上传的文件是否存在同名文件,但是在多个方法中反复拷贝了这段代码

for (int j = ; j < files.Length; j++)
{
saveName = Path.GetFileName(files[j]);
int i = ;
for (i = ; i < lvItemsList.Items.Count; i++)
{
ListViewItem item = lvItemsList.Items[i]; if ((lvItemsList.Items[i].Text).Contains(Path.GetFileName(saveName)))
{ if (MessageBox.Show("您已上传文件" + saveName + "有同名,是否覆盖?", "警告", MessageBoxButtons.YesNo) == DialogResult.Yes)
{ repeat = ;
UpLoadFile(FrmLog.ServerUrl + "/Default.aspx/", files[j], saveName, progressBar1);
// timer2.Enabled = true;
i = lvItemsList.Items.Count;
}
else
{
this.Random();
i = lvItemsList.Items.Count;
}
}
}

还有下面一段代码,作用是根据文件字节数改为以KB,MB,GB等方式显示,多处存在类似代码而未提取公用方法

if (FrmLog.FileListOfLoginedUser[j].FileSize *  < )
{
downSize = (FrmLog.FileListOfLoginedUser[j].FileSize * ) + "B";
}
else if (FrmLog.FileListOfLoginedUser[j].FileSize < )
{
downSize = FrmLog.FileListOfLoginedUser[j].FileSize + "KB";
}
else
{
downSize = decimal.Round(Convert.ToDecimal(FrmLog.FileListOfLoginedUser[j].FileSize / ), ).ToString() + "M";
}

该代码存在其他处的代码如下:

if (UsedSpace < )
{ this.Text = "地税云盘 " + FrmLog.LoginedUser.realName + " " + UsedSpace + "KB/" + quotaNum;
}
else
{
float sumFileSize = UsedSpace / ;
//decimal d = decimal.Parse(sumFileSize.ToString());
decimal d = Convert.ToDecimal(sumFileSize);
sumFileSize = float.Parse(decimal.Round(d, ).ToString());
this.Text = "地税云盘 " + FrmLog.LoginedUser.realName + " " + sumFileSize + "M/" + quotaNum;
}

上面代码微改进:

1.提取 "地税云盘  " + FrmLog.LoginedUser.realName + "  "为变量,如下

string title="地税云盘  " + FrmLog.LoginedUser.realName + "  ";

2.以MB显示直接用 (UsedSpace/1024).toString(“f2”)即可

5.代码画蛇添足晦涩难懂又欠缺注释,如

for (int j = ; j < files.Length; j++)
{
saveName = Path.GetFileName(files[j]);
int i = ;
for (i = ; i < lvItemsList.Items.Count; i++)
{
ListViewItem item = lvItemsList.Items[i]; if ((lvItemsList.Items[i].Text).Contains(Path.GetFileName(saveName)))
{ if (MessageBox.Show("您已上传文件" + saveName + "有同名,是否覆盖?", "警告", MessageBoxButtons.YesNo) == DialogResult.Yes)
{ repeat = ;
UpLoadFile(FrmLog.ServerUrl + "/Default.aspx/", files[j], saveName, progressBar1);
// timer2.Enabled = true;
i = lvItemsList.Items.Count;
}
else
{
this.Random();
i = lvItemsList.Items.Count;
}
}
}
if (!(i == lvItemsList.Items.Count + ))
{
UpLoadFile(FrmLog.ServerUrl + "/Default.aspx/", files[j], saveName, progressBar1);
// timer2.Enabled = true;
i = lvItemsList.Items.Count;
}

意图应该是存在同名文件进行提示,点Yes则上传覆盖文件,否则直接上传,这样应该思路很清晰,不知为何还要比较!(i == lvItemsList.Items.Count + 1), 另外!(i == lvItemsList.Items.Count + 1) 这种代码写法有些蹩脚容易让人费解,一般都是 i!=lvItemsList.Items.Count + 1

6. 代码冗长,多次嵌套if else 容易让人看晕,建议提取出方法或添加return

/// <summary>
/// 双击进入文件夹
/// </summary>
private void lvItemsList_MouseDoubleClick(object sender, MouseEventArgs e)
{
this.isFind = false;
ListViewHitTestInfo info = lvItemsList.HitTest(e.X, e.Y); if (info.Item == null) return;
lvItemsList.LargeImageList = UrlImage.SmallImageList; if (!(info.Item.Text.Contains(".")))//todo 此处存在问题,文件夹也可包含点 .,应以itemtype判断
{
lvItemsList.Items.Clear();
CurrentPath = info.Item.Tag.ToString() + "/" + info.Item.Text;
// CurrentPath = info.Item.Tag.ToString() + "/" + info.Item.Text;
FrmLog.FileListOfLoginedUser = this.GetFileList();
oldPath = info.Item.Tag.ToString(); if (FrmLog.FileListOfLoginedUser == null)
{
this.lblCurPath.Text = CurrentPath;
return;
}
for (int i = ; i < FrmLog.FileListOfLoginedUser.Count; i++)
{
if (FrmLog.FileListOfLoginedUser[i].Path == CurrentPath)
{
ListViewItem lvItem = new ListViewItem();
lvItem.Text = FrmLog.FileListOfLoginedUser[i].ItemName;
lvItem.Tag = FrmLog.FileListOfLoginedUser[i].Path;
if (switchViews == "")
{
/* if (!(lvItem.Text.Contains(".")))
{
lvItem.ImageIndex = 0;
}
else
{
int icon = UrlImage.ImageIndex(System.IO.Path.GetExtension(lvItem.Text));
lvItem.ImageIndex = icon;
}*/
int icon = ;
if (FrmLog.FileListOfLoginedUser[i].ItemType == "文件夹")
{
icon = UrlImage.ImageIndex(".folder");//新加
}
else
{
icon = UrlImage.ImageIndex(System.IO.Path.GetExtension(lvItem.Text));//新加
}
lvItem.ImageIndex = icon;//新加 //int icon = UrlImage.ImageIndex(System.IO.Path.GetExtension(lvItem.Text));
//lvItem.ImageIndex = icon;
// oldPath = FrmLog.FileListOfLoginedUser[i].Path; this.lvItemsList.Items.Add(lvItem);
}
else
{
lvItem.SubItems.Add(FrmLog.FileListOfLoginedUser[i].ItemType);
if (!(lvItem.Text.Contains(".")))
{
lvItem.SubItems.Add("");
}
else
{
lvItem.SubItems.Add(FrmLog.FileListOfLoginedUser[i].FileSize.ToString() + "KB");
} // lvItem.SubItems.Add(FrmLog.FileListOfLoginedUser[i].FileSize.ToString());
lvItem.SubItems.Add(FrmLog.FileListOfLoginedUser[i].UploadTime);
this.lvItemsList.Items.Add(lvItem); } }
else
{
oldPath = info.Item.Tag.ToString();
}
}
this.lblCurPath.Text = CurrentPath;
}
}

代码Review发现问题的更多相关文章

  1. 前端代码质量保障之代码review

    经验丰富的程序员和一般程序员之间的最大区别,不仅体现在解决问题的能力上, 还体现在日常代码的风格上.掌握一门技术可能需要几月,甚至几周就够了. 好的习惯风格养成却需数年. 团队成员之间需要合作,代码需 ...

  2. 由学习《软件设计重构》所想到的代码review(一)

    前言 对于一个程序猿来讲怎样来最直接的来衡量他的技术能力和产出呢?我想最直观的作法是看他的代码编写能力,就拿我常常接触的一些程序猿来看,他们买了非常多技术重构类书籍.可是看完后代码编写能力并没有显著提 ...

  3. 对于近阶段公司代码 review 小结

    来新公司,给公司的SDK review了一下.发现了不少小问题,在此总结一下. (我下面说明问题可能是很简单,但是搞清楚某些问题还是花了些时间的,大家引以为戒吧) 先谈谈处理的问题: 1.某天QA说有 ...

  4. 代码review

    对于代码review个人也有些小小的看法: 1.首先我觉得我们所有开发人员要弄明白 现在Code Review 的目的 ,凡事不弄明白目的,无法做好完成一件事情,个人觉得有以下一些目的: a)可以在项 ...

  5. Gerrit代码Review实战

    代码审核(Code Review)是软件研发质量保障机制中非常重要的一环,但在实际项目执行过程中,却因为种种原因被Delay甚至是忽略.在实践中,给大家推荐一款免费.开放源代码的代码审查软件Gerri ...

  6. 敏捷开发:代码Review

    热情高涨 代码走查作为一种流程形式,起初大家的参与热情非常高涨. 因为,自己可以学习到别人一些巧妙的思想,自己的代码和习惯都暴漏出来. 这个过程中不断地吸收和改正. 但是...... 我们一开始组织的 ...

  7. 部署代码review和CI

    公司原先搭了一个代码Review的服务器,由于历史原因,装的是一个32bit的Ubuntu系统,后来由于需要,需要安装gitlab,由于gitlab需要64位系统,所以临时凑合了个vagrant,本质 ...

  8. 代码review的流程

    以前我们一直都是如果要进行代码review的时候,要不我们就直接用idea来进行查看,根据不同的来查看 但是我们都是看代码的不同来进行来实现的,其实我们不需要这样,我们可以使用工具Phabricato ...

  9. 研发团队如何借助Gitlab来做代码review

    代码review是代码质量保障的手段之一,同时开发成员之间代码review也是一种技术交流的方式,虽然会占用一些时间,但对团队而言,总体是个利大于弊的事情.如何借助现有工具在团队内部形成代码revie ...

随机推荐

  1. Java学习个人备忘录之线程间的通信

    线程间通讯多个线程在处理同一资源,但是任务却不同. class Resource { String name; String sex; } //输入 class Input implements Ru ...

  2. Java 抽象类和Final关键字

    抽象类 用abstract关键字来修饰一个类时,这个类叫抽象类: 用abstract关键字来修饰一个方法时,该方法叫做抽象方法. 含有抽象方法的类必须被定义而为抽象类,抽象类必须被继承,抽象方法必须被 ...

  3. lintcode-34-N皇后问题 II

    34-N皇后问题 II 根据n皇后问题,现在返回n皇后不同的解决方案的数量而不是具体的放置布局. 样例 比如n=4,存在2种解决方案 标签 递归 思路 参考http://www.cnblogs.com ...

  4. iOS开发多线程编程2 - NSOperation

    1.简介 NSOperation实例封装了需要执行的操作和执行操作所需的数据,并且能够以并发或非并发的方式执行这个操作. NSOperation本身是抽象基类,因此必须使用它的子类,使用NSOpera ...

  5. 【Linux】- ps -ef |grep 命令

    ps:将某个进程显示出来 grep:查找 |:管道命令 表示ps命令与grep同时执行 PS是LINUX下最常用的也是非常强大的进程查看命令 grep命令是查找,是一种强大的文本搜索工具,它能使用正则 ...

  6. 网众远程修改ip、dns

    修改文件 修改ip vi /etc/rc.d/rc.inetd1.config IPADDR[0] 对应第一块网卡的ip 修改dns vi /etc/resolv.conf nameserver 21 ...

  7. Windows Server 2012四大版本介绍

    今天刚好要尝试安装Windows Server 2012,在网上百度了下发现有4个版本,分别是: Datacenter数据中心版. Standard标准版. Essentials版. Foundati ...

  8. Chromium之工程类别

    虽然有700多个project,其实有很多是不成声二进制执行文件的,他们主要是调用cygwin的环境,执行一些python的脚本. 具体这个.py文件做了哪些共工作,还要再研究,目前看到有打包一些.p ...

  9. .NET环境下,通过LINQ操作SQLite数据库

    //对应数据库中的某个表 [Table(Name = "main.Student")]    public class Student    {        [Column(Na ...

  10. 再看RCU

    从昨天晚上开始,我就立志要把RCU拿下,昨晚加今天早上看了RCU的东西,太细节的原理我就不扣了,放弃,知道RCU是怎么用的就可以了,赶紧看文件系统中dcache的管理了. 说说RCU,RCU其实是很简 ...