由一份漏洞百出的代码所引出来的:
switch(choosen)
{case 1:
//增加货物
system("cls");
storage1.Input();
system("pause");
break;
case 2:
//删除货物
system("cls");
storage1.Delete();
system("pause");
break;
case 3:
//查看货物信息
system("cls");
storage1.print();
system("pause");
break;
case 4:
system("cls");
//修改货物信息
storage1.modify();
//storage1.search();
system("pause");
break;
case 5:
//查找货物
system("cls");
storage1.search();
system("pause");
break;
case 6:
system("cls");
//按入库时间排序
storage1.PaiXu(paixu);
storage1.look(paixu);
system("pause");
break;
//case 7:
// system("cls");
// //按到期时间排序
// break;
case 7:
system("cls");
quit();
flag=0;
break;
}
**** 13:19:04
我觉得你这个程序有可以改进的地方吗?
### 13:19:31
少个default?
**** 13:19:49
嗯。switch 没default是很糟糕的事情
**** 13:19:51
还有呢?
**** 13:20:10
为什么需要default?
### 13:20:24
清屏可以放在前面
### 13:20:39
程序的健壮性
### 13:20:52
防止误操作
**** 13:22:29
那不是误操作。确切来说是你开放给他的
### 13:22:48
?
**** 13:23:28
用户不会仔细地去看你的说明书,永远也不会有这么乖的用户
### 13:23:47
恩,我就是一个
### 13:23:48
呵呵
**** 13:25:20
清屏那个也说对了,既然都要清屏,提取出来代码更精简
**** 13:27:49
还有呢?
### 13:28:21
接口不好
### 13:28:37
不好在哪里?
### 13:29:05
一般都会给用户提供接口,让用户传参的。
### 13:29:40
直观明了么?还是移植性?
### 13:30:04
数据的安全性?
**** 13:30:30
这段程序里面,你一直在用过程
**** 13:30:33
没有用函数
### 13:30:36
我也不大清楚。。。我一般都是无参的
### 13:31:02
??不大懂。。
**** 13:31:13
假如我说:###,你这个界面做的不好,用户说要改成这样。
**** 13:31:37
你这种过程写法,会把你累垮的。
### 13:32:04
怎么会?功能就那几个?
### 13:32:40
额。。我好像知道了。。
**** 13:32:41
因为你这个程序小,所以你觉得没什么
### 13:33:31
比如说洗脸刷牙。必须分开,因为不是每个人都要洗脸刷牙的。。有刷牙洗脸,只刷牙或只洗脸的。。。
### 13:33:38
对么?
**** 13:34:20
不完全对,io输入输出是很容易出错的,界面是变动最大地方。你把它和你的数据处理类捆绑在一起,这是很不合理的
**** 13:34:57
假如我说:###,你那个storyage,我这个函数也要用到,你给发一个
### 13:35:21
就是要检测数据的是否非法?
**** 13:35:33
结果,里面一大堆cout,放到我这边就一点都不好用
![]()
**** 13:36:08
因为我根本不需要cout,我的数据是从网络获取的
###13:36:25
哦
### 13:36:48
有些还是从文件读取的。。。
### 13:37:05
那我这种写法就固定死了方法。。。
**** 13:37:25
嗯。你这种写法,只能在你这个程序用。
**** 13:37:47
这种代码没有一点重用性
###13:38:08
恩,我原来还不知道为什么都要传参。。现在知道了。。。
### 13:38:35
我基本上就没考虑到io的方式。。
**** 13:38:51
我们不能成为码农,做过的东西还要做,可以直接拿来用不是有更多的时间考虑其它事情吗?
###s 13:39:52
恩
**** 13:40:44
还有呢?
### 13:41:56
storage1.PaiXu(paixu);
storage1.look(paixu);
这不该放一块?
### 13:44:42
还有就不知道了。。。注释不规范?
**** 13:44:55
你这个程序有没有给别人看过?
### 13:45:27
就给老师演示了一遍。。代码没人看吧。。‘
**** 13:45:30
他们说了些什么?
### 13:46:14
有些函数可以直接用的。。。类可以直接赋值。。没必要这么麻烦
**** 13:46:25
我先当第一个吧,为啥你要说明那个txt文档放在e:盘?
**** 13:46:44
假如我不小心把它删了呢?
**** 13:50:00
我辛辛苦苦保存的东西,结果我发现找不到了。我肯定打电话给程序员###:喂,你这个软件太差劲了,我保存的东西不见了。
### 13:50:37
那要放哪?
我觉得你这个程序有可以改进的地方吗?
### 13:19:31
少个default?
**** 13:19:49
嗯。switch 没default是很糟糕的事情
**** 13:19:51
还有呢?
**** 13:20:10
为什么需要default?
### 13:20:24
清屏可以放在前面
### 13:20:39
程序的健壮性
### 13:20:52
防止误操作
**** 13:22:29
那不是误操作。确切来说是你开放给他的
### 13:22:48
?
**** 13:23:28
用户不会仔细地去看你的说明书,永远也不会有这么乖的用户
### 13:23:47
恩,我就是一个
### 13:23:48
呵呵
**** 13:25:20
清屏那个也说对了,既然都要清屏,提取出来代码更精简
**** 13:27:49
还有呢?
### 13:28:21
接口不好
### 13:28:37
不好在哪里?
### 13:29:05
一般都会给用户提供接口,让用户传参的。
### 13:29:40
直观明了么?还是移植性?
### 13:30:04
数据的安全性?
**** 13:30:30
这段程序里面,你一直在用过程
**** 13:30:33
没有用函数
### 13:30:36
我也不大清楚。。。我一般都是无参的
### 13:31:02
??不大懂。。
**** 13:31:13
假如我说:###,你这个界面做的不好,用户说要改成这样。
**** 13:31:37
你这种过程写法,会把你累垮的。
### 13:32:04
怎么会?功能就那几个?
### 13:32:40
额。。我好像知道了。。
**** 13:32:41
因为你这个程序小,所以你觉得没什么
### 13:33:31
比如说洗脸刷牙。必须分开,因为不是每个人都要洗脸刷牙的。。有刷牙洗脸,只刷牙或只洗脸的。。。
### 13:33:38
对么?
**** 13:34:20
不完全对,io输入输出是很容易出错的,界面是变动最大地方。你把它和你的数据处理类捆绑在一起,这是很不合理的
**** 13:34:57
假如我说:###,你那个storyage,我这个函数也要用到,你给发一个
### 13:35:21
就是要检测数据的是否非法?
**** 13:35:33
结果,里面一大堆cout,放到我这边就一点都不好用
**** 13:36:08
因为我根本不需要cout,我的数据是从网络获取的
###13:36:25
哦
### 13:36:48
有些还是从文件读取的。。。
### 13:37:05
那我这种写法就固定死了方法。。。
**** 13:37:25
嗯。你这种写法,只能在你这个程序用。
**** 13:37:47
这种代码没有一点重用性
###13:38:08
恩,我原来还不知道为什么都要传参。。现在知道了。。。
### 13:38:35
我基本上就没考虑到io的方式。。
**** 13:38:51
我们不能成为码农,做过的东西还要做,可以直接拿来用不是有更多的时间考虑其它事情吗?
###s 13:39:52
恩
**** 13:40:44
还有呢?
### 13:41:56
storage1.PaiXu(paixu);
storage1.look(paixu);
这不该放一块?
### 13:44:42
还有就不知道了。。。注释不规范?
**** 13:44:55
你这个程序有没有给别人看过?
### 13:45:27
就给老师演示了一遍。。代码没人看吧。。‘
**** 13:45:30
他们说了些什么?
### 13:46:14
有些函数可以直接用的。。。类可以直接赋值。。没必要这么麻烦
**** 13:46:25
我先当第一个吧,为啥你要说明那个txt文档放在e:盘?
**** 13:46:44
假如我不小心把它删了呢?
**** 13:50:00
我辛辛苦苦保存的东西,结果我发现找不到了。我肯定打电话给程序员###:喂,你这个软件太差劲了,我保存的东西不见了。
### 13:50:37
那要放哪?
**** 13:50:55
一般放在程序运行的目录下
###s 13:51:28
但是又有人说放在那,一旦卸载了。。什么东西都不见了。。
**** 13:52:36
软件卸载的时候不是有提示吗?要保留xxx数据吗?
###13:53:21
这倒没注意。。我是上回装matlab的时候,把东西存到了目录下,人家告诉我的
**** 13:53:59
是的,装QQ也这么提示过的。推荐数据放在我的文档中
### 13:54:23
哦
### 13:56:08
了解~
**** 13:56:30
while(flag)
{
一般放在程序运行的目录下
###s 13:51:28
但是又有人说放在那,一旦卸载了。。什么东西都不见了。。
**** 13:52:36
软件卸载的时候不是有提示吗?要保留xxx数据吗?
###13:53:21
这倒没注意。。我是上回装matlab的时候,把东西存到了目录下,人家告诉我的
**** 13:53:59
是的,装QQ也这么提示过的。推荐数据放在我的文档中
### 13:54:23
哦
### 13:56:08
了解~
**** 13:56:30
while(flag)
{
system("cls");table();cout<<"请输入你要操作的序号:";cin>>choosen;system("cls");switch(choosen){case 1://增加货物storage1.Input();system("pause");break;case 2://删除货物storage1.Delete();system("pause");break;case 3:
//查看货物信息storage1.print();system("pause");break;case 4://修改货物信息storage1.modify();//storage1.search();system("pause");
break;case 5://查找货物storage1.search();system("pause");break;case 6://按入库时间排序storage1.PaiXu(paixu);storage1.look(paixu);system("pause");break;//case 7:// system("cls");// //按到期时间排序// break;case 7:quit();flag=0;break;}
}
**** 13:56:42
还可以改进吗?
### 13:58:20
要检测choose是不是在1~7之间吗?
### 13:58:52
我还真看不出来了。。
**** 13:58:56
嗯,但不是必须得,毕竟有default了
### 13:59:58
真不知道了
**** 14:00:11
Input 改成AddGoods()不是更好吗?
### 14:00:56
(⊙o⊙)哦
**** 14:01:31
见名思义
### 14:01:44
恩
### 14:04:51
现在看看。。问题还真多。。
**** 14:05:27
class Date
**** 13:56:42
还可以改进吗?
### 13:58:20
要检测choose是不是在1~7之间吗?
### 13:58:52
我还真看不出来了。。
**** 13:58:56
嗯,但不是必须得,毕竟有default了
### 13:59:58
真不知道了
**** 14:00:11
Input 改成AddGoods()不是更好吗?
### 14:00:56
(⊙o⊙)哦
**** 14:01:31
见名思义
### 14:01:44
恩
### 14:04:51
现在看看。。问题还真多。。
**** 14:05:27
class Date
{
private:int year;int month;int day;public:int getyear(){return year;}void setyear(int year1){
year=year1;
}void setmonth(int month1){month=month1;}void setday(int day1){day=day1;}void setdate(Date date ){year=date.getyear();month=date.getmonth();day=date.getday();}int getmonth(){return month;}int getday(){return day;}Date getdate(){return *this;}bool Sort(Date Product_date)//本身大的返回0.{if(this->getyear()>Product_date.getyear())return 1;else if(this->getyear()<Product_date.getyear())return 0;else{if(this->getmonth()>Product_date.getmonth())return 1;else if(this->getmonth()<Product_date.getmonth())return 0;else{if(this->getday()>Product_date.getday())return 1;else if(this->getday()<Product_date.getday())return 0;
}}}};
**** 14:06:03
假如我要弄个日期
**** 14:06:34
Data data; data.SetYear() .SetMonth, SetDay
**** 14:06:39
不是太罗嗦了吗?
### 14:06:58
还要加一个一起的。。
### 14:07:17
void setdate(Date date )
{
year=date.getyear();
month=date.getmonth();
day=date.getday();
}
**** 14:07:22
c++有个构造函数的。
**** 14:07:35
我只需这样就可以了
### 14:07:40
恩,但没用上
**** 14:07:59
Data data(2011, 8, 1);
LoTus 14:08:02
v Date(Date date )
{
year=date.getyear();
month=date.getmonth();
day=date.getday();
}
### 14:08:12
o
**** 14:08:27
你c++不合格。好好再学学
### 14:08:29
接口又错了。。。
### 14:08:43
**** 14:08:49
接口没错,但太罗嗦了。而且效率不高
### 14:09:31
恩,我就说我代码怎么这么长。。。。
**** 14:10:24
void setdate(const Date &date )
{
year = date.year;
month = date.month;
day = date.day;
}
**** 14:10:41
QQ发得格式乱了,
**** 14:11:08
###同学,你c++要重头学过。
### 14:11:47
QQ发得格式乱了。。。什么意思?
### 14:12:13
**** 14:12:20
本来我的格式是漂亮的, 发到你那里就变乱了。
**** 14:13:53
别迷惘了。你这c++水平,直接被面试官鄙视了。
### 14:14:42
### 14:15:35
师父,有漂亮的代码么?我想知道什么样的算是漂亮的代码,我都没什么概念,老按自己想的左
**** 14:16:17
我有跟你说过啊。那个《高质量c/c++》编程规范
#### 14:17:21
额。。有么。。不记得了。。
**** 14:17:21
case 1:
**** 14:17:44
这个被称为magic number
**** 14:18:14
为啥这么说,因为过了个把月,连编程人员都不知道它是什么意思
**** 14:18:32
那你得加注释。没错,但还有更好的办法
### 14:18:39
哦,还是那个。见名思意
### 14:18:56
宏定义?
**** 14:18:47
enum学过吗?
**** 14:18:49
嗯
### 14:18:58
学过
### 14:19:03宏定义?
**** 14:18:47
enum学过吗?
**** 14:18:49
嗯
### 14:18:58
学过
枚举。。
**** 14:19:10
enum跟宏又有区别
### 14:19:11
里面自动编号
### 14:19:13
恩
### 14:19:16
我知道
### 14:19:31
宏定义只是单纯的替换
###14:19:37
枚举是个数组
**** 14:19:39
除了自动编号,最重要可以编译的时候检查
###14:20:06
把default的功能也省了??
**** 14:22:11
啊
**** 14:22:19
default还是要的。
............
至此以后,沉淀,沉淀,再沉淀。。。。不该以为学懂了C++语法就懂得了C++。。。死命抱着C++ primer plus 狂啃吧。。。不知道对大家有没有启示,反正我是被打击了。。。少年轻狂万万不可啊。。。