站内搜索: 请输入搜索关键词

当前页面: JAVA 编程资料牛鼻论坛Java & J2SE 技术区→一个好的学习心得方法讨论!

一个好的学习心得方法讨论!

发表新主题   回复此主题

第1楼 2005-07-02 06:44 紫檀花 写道:

一个好的学习心得方法讨论!


定义一个人的类,人有姓名,年龄的属性
在构造函数中初始化姓名,
编写设置年龄的方法(取值范围0-100) (方法1)
编写显示的方法,显示人的姓名和年龄 (方法2)

定义一个中国人的类,除了有上面的所有属性和方法之外
还有属相和国籍的属性,其中国籍是一个类的定量
构造函数中除了初始化姓名之外,还要初始化属相
显示的方法要显示这个中国人的姓名、年龄、属相, (方法1)
编写类的显示国籍的方法 (方法2)

主类中,分别创建以上两个类的实例,
并通过方法设置对象的各个属性,最后显示姓名、年龄、属相、国籍


第2楼 2013-08-31 12:44 Robot :

一个好的学习心得方法讨论! 相关


第3楼 2005-07-02 08:34 紫檀花 写道:

Re:一道新题


以下是老师给的答案,哪位给解释一下?
class Chinese extends Person
{
//属相
private String strAnm = "";
//国家(静态定量)
private static final String COUNTRY = "CHINA";

//构造函数
public Chinese(String s,String a){
  //调用父类构造函数来初始化
super(s);
//为属相赋值
strAnm = a;
}

//显示
void showme(){
  //调用父类方法显示姓名年龄
super.showme();
//显示属相
System.out.println("my Anm is " + strAnm + " .");
}

//显示国籍(类的方法)
static void showCountry(){
System.out.print("i'm from " + COUNTRY);
}
}

class Person{

//姓名
private String strName = "";
//年龄
private int iAge = 0;

//构造函数
public Person(String s){
  //为姓名赋值
strName = s;
}

//设置年龄
void setAge(int a){
if (a < 100 && a > 0)
iAge = a;
}

//显示姓名和年龄
void showme(){
System.out.print("i'm " + strName + ". ");
System.out.println("i'm " + iAge + " old.");
}
}

public class test
{
public static void main(String args[])
{
//初始化对象
Person Per1 = new Person("Kitty");
Person Per2 = new Person("Bush");
//调用方法
Per1.setAge(20);
Per2.setAge(55);

Per1.showme();
Per2.showme();

//初始化对象
Chinese Chn1 = new Chinese("小明","猪");
Chinese Chn2 = new Chinese("小梦","羊");
//调用方法
Chn1.setAge(22);
Chn2.setAge(18);

Chn1.showme();
Chn2.showme();

Chinese.showCountry();
}
}


第4楼 2005-07-02 08:50 紫檀花 写道:

Re:一道新题


不是懒惰,是看不懂向大家请教


第5楼 2005-07-02 08:56 gongshi 写道:

Re:一道新题


If you don't understand such a simple program after your teacher gave you such detailed answer with comments in it. I don't think anybody in the forum can do anything to help you.

You'd be better to change your major to learn something else. That is the best advice I can give.

Sorry! It sounds not good, but it is truely from my heart....


第6楼 2005-07-02 09:07 gongshi 写道:

Re:一道新题


In education, there is a famous saying:

"The question is not how smart you are, but how you are smart."

In Chinese, it probably means, "问题不在於你是否聪明,而是你在哪方面聪明。"

Finding out where and on what your talent is, that is very important and benificial to your life and future.

Not everyone can be a good programmer. However, everyone can be good on something you really good at.

Find that out, and smile!

Good luck to your future!


第7楼 2005-07-02 09:19 gongshi 写道:

Re:一道新题


I do know a girl, who does not know how to program, but she became a good project manager, and she is managing a programming group with 15 programmers...

This is a true story...


第8楼 2005-07-02 10:47 紫檀花 写道:

Re:一道新题


gongshi ,谢谢你的好建议,我虽然不期望最终达到你说的那个女孩子的标准,但我是一定会努力的。


第9楼 2005-07-02 15:54 gongshi 写道:

Re:一道新题


I'm glad I got my point through.

Actually, this Chinese girl got her master's degree, she will be sent to France to be a higher ranking project manager by a reputable international company. She will be there in October. And she is taking a French language course right now. She is especially good at designing and managing.


第10楼 2005-07-03 05:24 lhq_007 写道:

Re:一道新题


这样很好,像我等英语菜鸟们可以学学哈!!!
还好,基本能看懂,嘿嘿


第11楼 2005-07-03 14:24 woshiazhi 写道:

Re:一道新题


很爽啊,看的懂,终于知道学英语是有用的了,除了看java 技术文档外


第12楼 2005-07-04 11:31 karonque 写道:

Re:一道新题


是不是刚开始学java啊?是的话,刚开始可能会有点不得要领,慢慢来,另外与和你一起学习的同学多交流,看别人掌握的如何,看问题出在哪里,有时候技术水平的差异会导致别人无法帮助你,例如我就不知道你对这段code有什么不明白的。


第13楼 2005-07-05 06:16 rain512 写道:

Re:一道新题


"问题不在於你是否聪明,而是你在哪方面聪明。"
为什么我们中国人不知道这样话,而老外却很清楚呢?
我觉得我们应该认真地思考。


第14楼 2005-07-05 10:51 紫檀花 写道:

Re:一道新题


您的意思是我现在还在JAVA学习的最底层?正常情况下大家都应该明白的东西而我不明白,那我是不是就没希望学好JAVA了?:(


第15楼 2005-07-05 11:08 summertea 写道:

Re:一道新题


找本基础知识的书从头看起吧,有一天你会对不明白的地方豁然开朗的。
good luck to you!


第16楼 2005-07-05 11:24 karonque 写道:

Re:一道新题


只要不是傻瓜,怎么可能学不会,天下没有不合格的学生,只有不合格的老师。ok?


第17楼 2005-07-05 11:26 baidongli 写道:

Re:一道新题


每一个高手都是从闻简单的学起的!

一步一步的来,用一颗恒心来换取最终的胜利!

这是我的观点,我也是一个Java初学者,希望能和大家一同进步!


第18楼 2005-07-05 20:08 dongbeilao 写道:

Re:一道新题


引用原文:
karonque wrote:
只要不是傻瓜,怎么可能学不会,


Wrong! wrong!! Wrong!!!

学不会 does not meadn he/she is 傻瓜, it means he/she is good at something else!!!

Peopel are different!!!

引用原文:
karonque wrote:
天下没有不合格的学生,只有不合格的老师。ok?



Wrong! wrong!! Wrong!!! There are 不合格的学生, there are 不合格的老师 too!!!


第19楼 2005-07-06 02:09 紫檀花 写道:

Re:一道新题


我不是不合格,是编程基础太差了,以前一点接触都没有,现在突然要在几个月之内完成并拿出自己的作品,感到实在是压力好大的


第20楼 2005-07-06 02:50 ycoolb 写道:

Re:一道新题


我也是没有基础的 虽然我现在已经不是很菜了, 但是有的地方也是根本就不懂 但是关键在于 我在努力 我觉得就够了

PS: 我一开始的时候也是很迷惑


第21楼 2005-07-06 04:53 紫檀花 写道:

Re:一道新题


那请问楼上,你大概迷惑了多长时间才进入了正轨?


第22楼 2005-07-08 16:46 紫檀花 写道:

Re:一道新题


楼上的跑了,那其他同仁呢?指教一下,学习JAVA是不是真的必须都要经过一个迷惑的过程呢?那怎样才能缩短这个迷惑期呢?期待中……


第23楼 2005-07-08 17:51 drmcer 写道:

Re:一道新题


楼上说的这个"迷惑的过程"我管它叫"阵痛期", 这个在学习过程中应该是必然的, 至少对于非天才的人来讲是这样. 一个人的学习能力和接受能力准定了这个"阵痛期"的长短. 我是这样认为的, 请大家批评, 谢谢!!!


第24楼 2005-07-08 19:05 cyhhappy 写道:

Re:一道新题


可能只是想习惯用英语而已,英语对一个学编程的人来说真的很重要


第25楼 2005-07-08 19:08 drmcer 写道:

Re:一道新题


但把英语强加给其它人就不是很good了! 当然不爱看英语的人可以不看吗, 对不对!!! (gongshi别生气我没有别的意思)


第26楼 2005-07-12 06:38 bobomomo 写道:

Re:一道新题


我是一个刚毕业的学生,进入公司四天,也学了四天的JAVA。也许我和楼主的感觉差不多吧。
说说我的心得。基础知识的书要反复的看,一边看一边实践,在动手的过程中又会遇到许多问题,继续看书理解。初学JAVA就是要理解面向对象的思想,这是我老师给我讲的。我比较笨,一遍看不懂就看两遍,再不懂就看5遍,多看书多动手,慢慢就能理解了。


第27楼 2005-07-12 12:18 dotnetdotcn 写道:

Re:一道新题


我也是新手,这次我得到锻炼了,你没有


第28楼 2005-07-17 06:34 linofficewhl 写道:

Re:一道新题


英语标准吗?不标准会教坏人的!建议还是用中文好!不要误导别人.


第29楼 2005-07-17 08:20 laodabest 写道:

Re:一道新题


it is just a very simple program,it is the base of java,if you do not understand what it is mean ,i think you should learn somgthing more


第30楼 2005-07-17 17:50 ranchgirl 写道:

Re:一道新题


引用原文:
linofficewhl wrote:
英语标准吗?不标准会教坏人的!建议还是用中文好!不要误导别人.



What a "good" idea?

中文标准吗?不标准会教坏人的! 建议还是.......! 不要误导别人.

Take a look on the forum, only read those titles, how many 中文 syntax, charactors are wrong out there???

Stop using Chinese????????????!!!!!!!!!!!!!!!!

Obviously, you are wrong!!!!

Stop whining, please!!!


If you don't like others' posts in English, stop reading them, ignore!
We are not going to be offended. Thanks!


第31楼 2005-08-16 09:57 reason001 写道:

Re:一道新题


技术 -》外语 -》国籍 -》。。。。。-》人格 -》封贴:(

The universe are full of good things patiently waiting for out wits to grow sharper.
We should be sincere to each other and make progress together.Then let's enjoy the wonderful time in the near future./


第32楼 2005-08-17 08:49 zlf8852 写道:

Re:一道新题


我是学计算机科学与技术的,我以前编程考试就是蒙混过关,基础有点,现在只找到电脑硬件销售的工作.哎,java前景不错,现在每天晚7点回家,还要看两个小时java,一点玩的时间也没,真他妈的苦啊,不过用周星驰的话说"不过我喜欢"
等我涉及到j2ee,我就重找工作了


第33楼 2005-08-17 09:07 feizhouyu 写道:

Re:一道新题


以前我主要用的c,c++,开始接触java,也学习了一段时间,现在感觉自己很多细节的方面依然是稀里糊涂,很多问题凭感觉知道是那样但要讲出为什么却又说不清楚,我下一步该怎么做呢,是不是自己程序实际写的太少了阿
请指点一下


第34楼 2005-08-17 10:04 stephensuen 写道:

Re:一道新题


我遇到过很多初学 Java 的人,他们的学习方法是在论坛或者网上,抄一些例子来试验,碰到问题,再通过论坛等提问。

我觉得这是一种非常糟糕的学习方法。下面是我个人对初学者的一些建议,不一定适合每个人,有兴趣可以沿此路尝试一下:

学习 Java,如果你有相当的 C/C++ 或者类似的语言乃至面相对象基础,那么你可能几天以后就不再是 Java 初学者了。除了这种情况下(当然这种情况,下面的建议应该还是有益无害的),Java 初学者一定要清楚,系统的学习是避免始终迷茫的有效途径。就是说,不要用我开头提过那种方法或者类似的方法,而是应该踏踏实实的选择1,2个可靠的系统资料,比如 Thinking in Java ,从头开始逐字逐句的学习,要善于捕捉学习过程中的哪怕是一点点似懂非懂之处。对每一个新鲜词汇,都要尽可能深入下去弄懂它。比如“关键字”,或者“变量”这样的术语往往因为太“简单”而被忽略,而实际上,这些就是决定你是否理解其它内容的关键。这时,你可以试着问自己一个问题,“什么是...”,脑海里不要想着“好像就是那个”,必须准确的回答自己这个问题,再继续下面的内容。“我明白,但是说不出来”其实就是在骗自己。对此类基础知识,Thinking in Java 之类的书籍可以深入浅出的让你迅速找到一些感觉(也就是可能说不出来,但好像明白的感觉),Java 语言规范中包含精确的定义(当然,有时“太”精确了,看起来会累死人)可以帮你建立准确的理解,之后再对照书籍加深理解。

当你在某个内容上涂入了太多的精力,仍然无法贯通时,是时候往下看了。但是牢记自己的疑问,最好记录下来。在随后的内容学习中,前后印证,你可能会解决自己的问题。

不要急于将疑问交给他人解答,应该尽可能自己尝试翻阅你的资料,前后对照,看看是否能解决。只有当你投入了实在过多的精力,仍然不能解决时,再去求助他人。这时,解决问题的过程将使你很容易理解别人对你的指点。问题本身得到解决仅仅是你巨大收获中的很小一部分。

通过这种途径,你会发现先是稀里糊涂,然后明白了一些,感觉进了一小步;接着很多疑问开始堆积,随着自己的努力加上他人在关键问题上的指点,忽然所有(或者大部分)的疑问一下子贯通起来,相互印证,都明白了,此时你就进了一大步。接下去,下一个内容还是这样,不懂,又感觉,晕,贯通......。学习的过程就是这样“跳跃式”的。这里最怕的就是感觉进了一小步时就满足了,凭感觉就去弄那些“高级”玩意了。

一家之言,最后强调一句话:

不要担心在基础的东西上花费的大量时间,不久你就会因此而嬴取十倍甚至百倍的时间

学习 Java 一两年仍然对大部分问题懵懵懂懂的人非常多,而真正投入精力在基础上,应该几个月就可以打下牢固的基础,之后再几个月就可以超过他们。

当然上面的建议可能不适合明天就要上班,帮老板弄个什么 JSP 出来,否则没饭吃的 :-)人。


第35楼 2005-08-17 10:24 xiaoyuonline 写道:

Re:一道新题


我学了两个月了,自认已经算是一个入门者了,我学的方法就是先粗略的把书看一遍,有不懂的地方先不管他,等看第二遍的时候就能弄懂一些第一遍不懂的地方,等我看第三编的时候效果就更好了!还有一个重要的学习方法就是多写代码,多看别人写的代码!期待和你们一起进步!


第36楼 2005-08-21 15:05 写道:

Re:一道新题


基础是最重要的,罗马也不是一天建成的~


第37楼 2005-08-22 03:51 ranchgirl 写道:

Re:一道新题


引用原文:
xiaoyuonline wrote:
我学了两个月了,自认已经算是一个入门者了,我学的方法就是先粗略的把书看一遍,有不懂的地方先不管他,等看第二遍的时候就能弄懂一些第一遍不懂的地方,等我看第三编的时候效果就更好了!还有一个重要的学习方法就是多写代码,多看别人写的代码!期待和你们一起进步!



Very good and efficient learning style!!!

I learn many things this way, not only for computer sciences. Skip hard things, get familiar with non-understandable terms, even you still know nothing about those terms. It will help a lot in the future.

The feeling of "似曾相识“, familiarity, helps a lot!!!

I helped a middle school boy who was a computer genius but was making Cs/Ds on history/geography/government courses. He became an A/B student on those courses in a very short period of time. And believe me or not, he did not spend extra time on those courses.

I told him the saying of “看报看题,看书看皮“ is trying to criticize somebody and sounded bad. However, if you took it as a learning method, it was an excellent learning style.

The simple method I told him was "Just open the books at random, read anything interesting, attractive, bold, with pictures, etc. when you are listening to your teacher in class. Skip anything boring, seems complicated, etc."

It is an incredible simple method, but it really worked.

Confession of A Ranchgirl:
I was doing exact the same thing when I was in elementary/middle/high schools, and even when I was in college, myself... LOL!


第38楼 2005-08-22 04:31 ranchgirl 写道:

Re:一道新题


引用原文:
stephensuen wrote:
我遇到过很多初学 Java 的人,他们的学习方法是在论坛或者网上,抄一些例子来试验,碰到问题,再通过论坛等提问。

我觉得这是一种非常糟糕的学习方法。
.................

不要担心在基础的东西上花费的大量时间,不久你就会因此而嬴取十倍甚至百倍的时间
...................



I don't like your learning style, but it is the best learning method for YOU, stephensuen!!

Different learning methods serve different people, try to find the best, suit YOU the best, learning method!!!!


第39楼 2005-08-22 04:46 ranchgirl 写道:

Re:!Learning style discussion!


I realized the “看报看题,看书看皮“is a good learning style when I was in graduate school, before that, that was just a habit, you might say, a bad habit.

Once I went to the library, and read a science magazine, there was an article with beautiful pictures and extremely hard to understand physics concepts. I did not understand a word in that article. It left a trace in my memory.

However, a few months later, a Canadian Professor came to the department to give a seminar, many graduate students attended. Believe me or not, none of them understood the seminar except me. The seminar topic was exact about the same topic I saw before in that magazine. The term familiarity, the feeling of ""似曾相识", made me excited, interested, and understood!!!!!


第40楼 2005-09-06 02:45 angelstx 写道:

Re:一个好的学习心得方法讨论!


不是没有希望,只是看你自己给不给自己希望,人人都是靠自己努力才会成功的,那些只会嘲笑别人的人也没什么出息的,只要喜欢,就去做就行了,加油~~


第41楼 2005-09-06 12:50 wangtian8008 写道:

Re:一道新题


引用原文:
rain512 wrote:
"问题不在於你是否聪明,而是你在哪方面聪明。"
为什么我们中国人不知道这样话,而老外却很清楚呢?
我觉得我们应该认真地思考。

学会了解自己很重要1!!!


第42楼 2005-09-14 19:24 xjlz0001 写道:

Re:一个好的学习心得方法讨论!


I believe if you study hard,and one day in the future,you will become a good programmer.


第43楼 2005-09-15 04:41 lidt17 写道:

Re:一个好的学习心得方法讨论!


赞成,既然决定学习java和编程,就不要找那么多的理由,努力去做去学习终能成功。
我就不信什么书都不看,也不练手的家伙就能学会编程,同样不信在别人给他讲解了程序后他就能学会编程。关键在于自己是否想要得到,内因最关键!


第44楼 2005-09-15 05:22 wen123 写道:

Re:一个好的学习心得方法讨论!


志在人为!!!!!


第45楼 2005-09-22 03:59 我不喜欢狂 写道:

Re:一个好的学习心得方法讨论!



我喜欢楼上的做法!!!!!
顶一个!


第46楼 2005-09-22 09:45 Unistar 写道:

Re:一个好的学习心得方法讨论!


我学习各种编程语言有几年了,诸如c,c++,c#,java等等
给我感受最深的还是我自己毕业设计时候的事情,当时我的毕业设计是利用.NET技术用c#语言编写一个ERP系统,可以说当时我是对这两个东西是完全没有接触,而且作为一个本科生我也没有什么编程的经验;当时导师跟我说:“一个星期之后你们就去做这个项目”,于是我买了书拼命的一天到晚的看,结果去的时候还是只有个朦胧的印象,也就是知道这个东西的程度吧。接下来的日子里面,刚开始的时候很难熬,很多不懂,怎么办呢?于是遇到问题了首先自己想办法,不行的话就查书问同事,这样下来个把月之后自己也能处理很多事情了,等到项目结束的时候自己也算是小有所成。我之所以拿这个事情来说呢,是因为我觉得那些所谓看一遍然后再看一遍的方法是没有太大的实际用处的,即使你通过不停的看书把java的所有语法都记住了也只能说你对Java语言有所了解,过不了多久你又会打回原型的。我的学弟在学编程的时候就容易犯这种毛病,总以为通过不停的看书就能学会编程,这种学习方法最多把你自己变成一个Java的小型图书馆而已,要想真正的学会编程,必须回到实践中去。编程的技巧和经验比编程语言的掌握有时候来的更加重要。


第47楼 2005-11-03 04:17 nihao530 写道:

Re:一个好的学习心得方法讨论!


新手上路中》》》》》》》
大家说得都很好
努力把


第48楼 2005-11-11 09:40 lovincode 写道:

Re:一个好的学习心得方法讨论!


哎,说实话,我都迷茫了不止是一个月了,甚至好几次都想放弃了,哈。我看了那个用英语写的东西,可以说还是有点感觉的吧,努力,我也能成功的。谢谢。虽然看到这个帖子的时间有点完了。


第49楼 2005-11-14 07:53 javacjava 写道:

Re:一个好的学习心得方法讨论!


如果你能在很短的时间把你说学的实际东西应用到JAVA上以后,那么我相信你就是学习JAVA的天才,不但这样,而且你更可能成为所有语言的天才。天下没有免费的午餐。
慢慢得来。什么事都有开头和结束!!!只有你付出总会有收获。。。。。。。。


第50楼 2005-11-14 08:48 garyt 写道:

Re:一个好的学习心得方法讨论!


脚踏实地


第51楼 2005-11-14 09:54 寒冰霜 写道:

Re:一个好的学习心得方法讨论!


师哥说的让我感触很深.我记得我在刚学编程时也是只知道看书,那时感觉还很好,但是到自己真正上阵的时候才发现自己什么都写不上去.虽然我的大脑里的基础知识很多,但是缺乏实际操作的能力.后来我上机调的程序多了,体会也就多了.多多思考,多多上机,多多调试,多多出问题.


第52楼 2005-11-14 10:04 寒冰霜 写道:

Re:一个好的学习心得方法讨论!


面向对象的思维方法
我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭,因为我早以习惯用C来编写程序,很欣赏C的简洁性和高效性,喜欢C简练而表达能力丰富的风格,特别忍受不了Java运行起来慢吞吞的速度,相对冗长的代码,而且一个很简单的事情,要写好多类,一个类调用一个类,心里的抵触情绪很强。

我对Java的面向对象的特性琢磨良久,自认为有所领悟,也开始有意识的运用OOP风格来写程序,然而还是经常会觉得不知道应该怎样提炼类,面对一个具体的问题的时候,会觉得脑子里千头万绪的,不知道怎么下手,一不小心,又会回到原来的思路上去。

举个例子,要发广告邮件,广告邮件列表存在数据库里面。倘若用C来写的话,一般会这样思考,先把邮件内容读入,然后连接数据库,循环取邮件地址,调用本机的qmail的sendmail命令发送。

然后考虑用Java来实现,既然是OOP,就不能什么代码都塞到main过程里面,于是就设计了三个类:

一个类是负责读取数据库,取邮件地址,调用qmail的sendmail命令发送;
一个类是读邮件内容,MIME编码成HTML格式的,再加上邮件头;
一个主类负责从命令读参数,处理命令行参数,调用发email的类。

把一件工作按照功能划分为3个模块分别处理,每个类完成一件模块任务。

仔细的分析一下,就会发现这样的设计完全是从程序员实现程序功能的角度来设计的,或者说,设计类的时候,是自低向上的,从机器的角度到现实世界的角度来分析问题的。因此在设计的时候,就已经把程序编程实现的细节都考虑进去了,企图从底层实现程序这样的出发点来达到满足现实世界的软件需求的目标。

这样的分析方法其实是不适用于Java这样面向对象的编程语言,因为,如果改用C语言,封装两个C函数,都会比Java实现起来轻松的多,逻辑上也清楚的多。

我觉得面向对象的精髓在于考虑问题的思路是从现实世界的人类思维习惯出发的,只要领会了这一点,就领会了面向对象的思维方法。

举一个非常简单的例子:假使现在需要写一个网页计数器,客户访问一次页面,网页计数器加1,计数器是这样来访问的

http://hostname/count.cgi?id=xxx

后台有一个数据库表,保存每个id(一个id对应一个被统计访问次数的页面)的计数器当前值,请求页面一次,对应id的计数器的字段加1(这里我们忽略并发更新数据库表,出现的表锁定的问题)。

如果按照一般从程序实现的角度来分析,我们会这样考虑:首先是从HTTP GET请求取到id,然后按照id查数据库表,获得某id对应的访问计数值,然后加1,更新数据库,最后向页面显示访问计数。

现在假设一个没有程序设计经验的人,他会怎样来思考这个问题的呢?他会提出什么样的需求呢?他很可能会这样想:

我需要有一个计数器,这个计数器应该有这样的功能,刷新一次页面,访问量就会加1,另外最好还有一个计数器清0的功能,当然计数器如果有一个可以设为任意值的功能的话,我就可以作弊了。

做为一个没有程序设计经验的人来说,他完全不会想到对数据库应该如何操作,对于HTTP变量该如何传递,他考虑问题的角度就是我有什么需求,我的业务逻辑是什么,软件应该有什么功能。

按照这样的思路(请注意,他的思路其实就是我们平时在生活中习惯的思维方式),我们知道需要有一个计数器类 Counter,有一个必须的和两个可选的方法:

getCount() // 取计数器值方法
resetCounter() // 计数器清0方法
setCount() // 设计数器为相应的值方法

把Counter类完整的定义如下:

public class Counter {
public int getCount(int id) {}
public void resetCounter(int id) {}
public void setCount(int id, int currentCount) {}
}

解决问题的框架已经有了,来看一下如何使用Counter。 在count.cgi里面调用Counter来计数,程序片断如下:

// 这里从HTTP环境里面取id值
...
Counter myCounter = new Counter(); // 获得计数器
int currentCount = myCounter.getCount(id); // 从计数器中取计数
// 这里向客户浏览器输出
...

程序的框架全都写好了,剩下的就是实现Counter类方法里面具体的代码了,此时才去考虑具体的程序语言实现的细节,比如,在getCount()方法里面访问数据库,更新计数值。

从上面的例子中看到,面向对象的思维方法其实就是我们在现实生活中习惯的思维方式,是从人类考虑问题的角度出发,把人类解决问题的思维方式逐步翻译成程序能够理解的思维方式的过程,在这个翻译的过程中,软件也就逐步被设计好了。

在运用面向对象的思维方法进行软件设计的过程中,最容易犯的错误就是开始分析的时候,就想到了程序代码实现的细节,因此封装的类完全是基于程序实现逻辑,而不是基于解决问题的业务逻辑。

学习JDBC编程的经典错误问法是:“我怎样封装对数据库的select操作?”

面向对象的设计是基于解决业务问题的设计,而不是基于具体编程技术的设计。我不会去封装select语句的,我只封装解决问题的业务逻辑,对数据库的读取是在业务逻辑的编码实现阶段才去考虑的问题。

回过头看上面那个发广告邮件的例子,应该如何应用面向对象的思维方法呢?

对于一个邮件来说,有邮件头,邮件体,和邮件地址这三个属性,发送邮件,需要一个发送的方法,另外还需要一个能把所有邮件地址列出来的方法。所以应该如下设计:

类JunkMail

属性:
head
body
address
方法:
sendMail() // 发送邮件
listAllMail() // 列邮件地址

用Java来表示:

public class JunkMail {
private String head;
private String body;
private String address;
public JunkMain() { // 默认的类构造器
// 从外部配置文件读邮件头和邮件体
this.head=...;
this.body=...;
}

public static boolean sendMail(String address) {
// 调用qmail,发送email
}

public static Collection listAllMail() {
// 访问数据库,返回一个邮件地址集合
}
}

当把JunkMail设计好了以后,再调用JunkMail类完成邮件的发送,将是非常轻松的事情。

如果说传统的面向过程的编程是符合机器运行指令的流程的话,那么面向对象的思维方法就是符合现实生活中人类解决问题的思维过程。

在面向对象的软件分析和设计的时候,要提醒自己,不要一上来就去想程序代码的实现,应该抛开具体编程语言的束缚,集中精力分析我们要实现的软件的业务逻辑,分析软件的业务流程,思考应该如何去描述和实现软件的业务。毕竟软件只是一个载体,业务才是我们真正要实现的目标。

但是在设计过程中,心里却往往在担心,如果我完全不去考虑程序代码的实现的话,那么我怎么知道我的设计一定合理呢?我怎么知道我设计的类、接口一定可以实现呢?所以经常可以看到的现象就是:

在设计过程中,虽然知道不能过早考虑代码实现,但是每设计一个类,一个接口,心里都要不知不觉的用自己熟悉的编程语言大概的评估一下,看看能否编出来,因此,一不小心,就会又回到按照程序功能实现的思路进行设计的老路上去了。

举个例子来说明,在做Web程序设计的时候,经常要遇到分页显示数据的情况。比如说需要把系统中所有的用户都列出来这样的功能。假设使用User类来表示用户,增加用户addUser(),删除用户deleteUser(),查询所有用户listUsers()方法。而数据库中有一个user表,一条记录是一个用户的信息。下面考虑一下User类的方法的实现:

addUser()和deleteUser()方法都好实现,就是对数据库增加记录和删除记录。对于listUsers()方法,其实就是对user表的select,取出一个记录集。但是该怎么从listUsers()方法中得到所有用户的列表呢?

一个方法调用的返回值只有一个,没有多个,所以很多情况下采用的办法就是返回值定义为集合类型,比如Vector。这样就可以在listUsers()方法的具体代码实现的时候,从数据库依次取出一个个记录,插入到Vector里面来。在主程序里面,调用listUsers()方法可以返回一个Vector,然后再对Vector遍历操作,就可以得到用户列表了。

public class User {

public static void addUser(...) {
// 数据库insert一条记录
}

public static void deleteUser(...) {
// 数据库delete一条记录
}

public Vector listUsers(...) {
// 数据库select结果放到一个集合里面
}
}

这样的设计基本合理,但是仍然有点小问题。因为在设计的时候,就考虑到了用Java的集合类Vector来实现对不定长数据集的存放,因而违反了面向对象设计的一个原则:在设计的时候不应过早的考虑具体程序语言的实现。所以必须用抽象的方法,和具体实现无关的方法来表达业务逻辑。

我们知道,通常对具有集合特征的数据结构进行遍历通常可以使用next和hasNext方法,next实现取下一个用户,hasNext判断是否还有元素。 因此我们定义一个接口Iterator,这个接口中定义两个方法next和hasNext:

public interface Iterator {
public boolean hasNext() {}
public Object next() {}
}

而User类的listUses方法返回值改为Iterator接口的实现类:

public class User {
...
public Iterator listUsers() {
}
...
}

这样就把User类的设计和具体的实现方法分离开了,因为此时任何实现了next()和hasNext()方法的类都可以做为listUsers的返回值,都可以被用来表达“用户列表”,而不仅仅可以使用Vector而已。比如,我可以用ArrayList来表达用户列表,因为ArrayList也实现了Iterator,当然我也可以自己专门写一个类来存放用户列表,只要实现next()和hasNext()方法就行了。

这样在具体的编写代码的时候,程序员具有了最大的灵活性,可以根据具体的情况,采用不同的编程方法来存放用户列表。特别是降低了程序的耦合度,提高了程序的可移植性。对于上面那个JunkMail的listAllMail()方法也同样应该改为接口类型。

然后,在主程序里面就这样来使用User类的listUsers方法:

User myUser = new User();
Iterator iterator = myUser.listUsers();
while (iterator.hasNext()) {
iterator.next();
}

这样就可以完全不用考虑程序代码实现了,从高层次上把功能抽象出来,定义成为接口,同时又可以把系统设计的很合理,完全根据业务的需求来进行设计。

结语

通过上面的几个例子的设计说明,使用面向对象的思维方法,其实是一个把业务逻辑从具体的编程技术当中抽象出来的过程,而这个抽象的过程是自上而下的,非常符合人类的思维习惯,也就是先不考虑问题解决的细节,把问题的最主要的方面抽象成为一个简单的框架,集中精力思考如何解决主要矛盾,然后在解决问题的过程中,再把问题的细节分割成一个一个小问题,再专门去解决细节问题。

因而一旦牢牢的抓住了这一点,你就会发现在软件设计和开发过程中,你自己总是会不知不觉的运用面向对象的思维方法来设计和编写程序,并且程序的设计和开发也变得不再那么枯燥,而一个合理运用面向对象技术进行设计和架构的软件,更是具备了思维的艺术美感。

最后,愿面向对象的思维方法也能给您的程序设计之路带来创作的乐趣。

以上信息来自 (china it power)网
作者:范凯
(也许这段话会让你对JAVA编程有新的了解)


第53楼 2005-11-14 18:14 学习Java中 写道:

Re:一个好的学习心得方法讨论!


我在动手过程中往往会感到难于下手,或思路短路要不就是烦躁,该怎么办呀


第54楼 2006-01-08 18:49 ranchgirl 写道:

Re:一个好的学习心得方法讨论!


抄,改,写,开发。

抄: Type, not copy/paste!!!!
改: Let the example from book do different things!
写: Write something similar, but from scatch!
开发: Develop a new application.


第55楼 2007-03-19 17:47 leondaa 写道:

Re:一道新题


分析内存最好的方法就是分析内存,懂得分析内存就懂得一切!


第56楼 2007-03-19 21:12 java_yw205 写道:

Re:一个好的学习心得方法讨论!


Very wonderful! I can study both ENGLISH and JAVA program here, I just come here a few days ago, and just study java for less than two months, glad to "meet " you all here^_^


第57楼 2007-03-23 00:34 xiaxiaorui2003 写道:

Re: 一个好的学习心得方法讨论!


不好意思,
我也看不明白


第58楼 2007-03-24 13:40 Sur_Michael 写道:

Re: 一个好的学习心得方法讨论!


It's wonderful!!!
I love this web site!


第59楼 2007-03-24 14:52 haw 写道:

Re:一道新题


yes~~

I also think so~~


第60楼 2007-03-30 02:24 xiaxiaorui2003 写道:

Re:一道新题


满简单的题啊!
我今天是学习JAVA第八天!
哈哈!
第三天的时候还看不懂这个,
现在学了继承和接口,
这个程序就看起来很简单了!
努力


第61楼 2007-04-30 09:33 zjgqs 写道:

Re:一道新题


天啊,原来我这个从来没英语考及格过的人也能看懂大师的英语中的意思耶
唉,这比看教课书有趣多了,我要加油...


第62楼 2007-04-30 17:38 lw_China 写道:

Re: 一个好的学习心得方法讨论!


额。。。LZ也别灰心,java其实不难的,看你有没有耐心去学而已。

我学的时候,《think in java 》里的每个程序都自己一行一行的研究过,多编译几次,多改改,顿时就什么都明白了。。

研究java包里面的源码也是很不错的,但是有一定的基础以后。


第63楼 2007-05-02 07:08 kk15378924 写道:

Re: 一个好的学习心得方法讨论!


偶刚入门...给自己定的方法是.
先把thinking in java的书啃个3-5遍.
然后就是看设计模型方面的书.
然后就是先找简单的例子做,比如实现记事本之类的.一开始就找项目做不现实,不可能你刚会吃饭会说话,你就能在社会上好好的生存.
最后才是找简单,相对经典的项目做.融会贯通你所学的设计模型和java基础.
估计时间在1年-2年之内.
强烈建议看书一概看英文的.中文翻译的实在是太差了,中文出版的也是很离谱.有些很重要的概念和英文的一对比,完全是两个概念.虽然说看不懂,很累,硬着头皮看啊.一天看几页,一个星期就能看得非常快了.毕竟这程序是外国人弄的,你看文档jdk,都是英文的.
如果你真的想在某一样语言上下功夫和发展,请学好英语,就算你连蒙带猜,第一遍也迷糊的先看过,第二遍,第三遍后效果就非常不错了.
偶看了一个星期的英文版thinking in java.头都大了,但依然坚持着慢慢看,看几遍.虽然才看到第4章,但也觉得很有收获.付出总有回报的!!!
PS :Thinking in java我第3章直接跳到后半部分的循环部分...前面的运算符号觉得没多必要仔细精读,毕竟是有C语言基础的,就算程序中碰到计算符问题,弄得几次代码编写也就明白了.其实说白了就是偶偷懒了..看这书就像他的名字一样,偶是来学编程思想的,不是来学数学.


发表新主题   回复此主题