作者归档:admin

妙解Hibernate 3.x——叩响面向对象思想之门 读书笔记

妙解Hibernate 3.x——叩响面向对象思想之门 读书笔记
在今年过生日的时候公司送了这本书给我,是部门老大挑的
找些时间看了下,由于在工作中并没有用到Hibernate,所有大部分内容没有看,
只看了前面的几章,当看到第三章,觉得仅第三章,这本书都值得一看(后面的章节由于用不到hibernate,只是简单过一遍)
第三章,看了不下三遍,觉得自己在某些地方还是看不懂,可能是对于面向对象的一些东西的理解还不够

使用继承、委托看待和拆解设计模式

将对象做虚,做软,不要被“变因”硬邦邦地绑住
—-封装变化

生成对象时,不直接new,才不会被具体对象绑死,此原则在学习面向对象中的创建模式有很好的指导作用
—-封装创建过程

模板方法与策略都将算法提取出来,只不过模板方法使用的是继承,策略使用的是委托
—-其实就这种模式,其本质应该是在其封装的变化的不同,模板方法是封装部分算法,而策略是封装整个算法
策略的重用性会高一些,只是需要付出一些额外的代价

回归最根本的面向对象思想:封装、继承、多态、委托

关于设计模式的学习:
1、接口、抽象类、具体对象是软件“软性”的指标之一,可按照实际需要的稳定性加以调整
2、研究模式三部曲:明确要解决的问题–>怎么解–>套用模式所带来的好处和副作用
3、从代码级看设计模式:
去掉new
去掉if/switch…case.
去掉重复的代码
4、开始接触一个新的设计模式,如果领导不到使用该模式的好处,不妨动手写一段程序,再来跟书中的实例进行比较
5、不时和自己的心灵对话—用自己的话来诠释模式,哪怕是简短的一句话,一个口诀,一个比喻
Builder 单一制程,不同风格
Sigleton just only one
Prototype 复制
Adapter 转换
Composite Tree
Decorator Dynamic composing behavior
Facade 简化
Proxy 本体/分身相互成就
Momento 借尸还魂
Strategy 替换多变的内部行为
6、不同的设计模式可能极其相似,搞不清是因为没有彻底掌握,这需要时间的积累
7、设计模式老是记不住,无法突破,那就放弃,过段时间再来温故知新
8、运用面向对象和设计模式,切忌矫枉过正,不要好处没得到,却被过度设计给弄复杂了

从Think in Data 到Think in Object

–EOF–

第一次写MySQL存储过程遇到的关于DELIMITER的问题

第一次写MySQL存储过程遇到的关于DELIMITER的问题
在很久很久以前写过Oracle的存储过程,昨天由于某些特殊的原因导致需要在MySQL中写一些存储过程,只能现学现用了
首先写了一个非常简单的存储过程,但是就是如此简单的过程也报错了,其代码如下:

1
2
3
4
5
 
CREATE PROCEDURE test()
BEGIN
    SELECT 'Hello Word!';                                                               
END

在phpmyadmin及客户端都报错,在phpmyadmin中显示:#1064 – You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ” at line 3

显然,程序在第一个分号后面出错了
原因不明,遂google之,找到如下地址:http://www.cnblogs.com/hsqzzzl/archive/2008/02/21/1076646.html
文章作者有说:分隔符是通知MySQL客户端已经输入完成的符号。一直都是用“;”,但是在存储过程中不行,因为存储过程中很多语句都需要用到分号
于是得到如下所示代码

1
2
3
4
5
6
DELIMITER ||
CREATE PROCEDURE test()
BEGIN
    SELECT 'Hello Word!';                              
END ||
DELIMITER ;

如果不想使用DELIMITER,在phpmyadmin中执行命令时,在Delimiter文本框中填写||

另在百度百科中有说明:http://baike.baidu.com/view/3068266.htm
MySQL中delimit命令。
  这个命令与存储过程没什么关系。
  其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。
  即改变输入结束符。
  默认情况下,delimiter是分号“;”。
  在命令行客户端中,如果有一行命令以分号结束,
  那么回车后,mysql将会执行该命令。
  但有时候,不希望MySQL这么做。因为可能输入较多的语句,且语句中包含有分号。
  默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句。
  因为mysql一遇到分号,它就要自动执行。
  这种情况下,就可以使用delimiter,把delimiter后面换成其它符号,如//或$$。
  此时,delimiter作用就是对整个小段语句做一个简单的封装。
  此命令多用在定义子程序,触发程序等musql自己内嵌小程序中。

邮票面值设计

【问题描述】
【描述 Description 】

  给定一个信封,最多只允许粘贴N张邮票,计算在给定M(N+M<=10)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大max ,使得1~max之间的每一个邮资值都能得到。 例如,N=3,M=2,如果面值分别为1分、4分,则在l分~6分之间的每一个邮资值都能得到(当然还有8分、9分和12分):如果面值分别为1分、3分,则在1分~7分之间的每一个邮资值都能得到。可以验证当N=3,M=2时,7分就是可以得到连续的邮资最大值,所以MAX=7,面值分别为l分、3分。 【样例输入】 共一行,两个整数,分表为N与M的值。 【输入格式 Input Format 】 一行,分别为N,M。 【输出格式 Output Format 】 两行。 第一行为m种邮票的面值,按升序排列,各数之间用一个空格隔开。 第二行为最大值。 【样例输入 Sample Input 】 3 2 【样例输出 Sample Output 】 1 3 MAX=7 算法分析 深搜加DP 栈记录所用邮票的面值 每次面值的搜索的范围为:上一次使用的邮票面值+1 to 上一次连续达到的最大值+1 然后DP,记录达到每个面值用的最少邮票数,不断更新最优解 注意要从第1张邮票开始,否则要出错 【代码】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <stdio.h>
 
int a[11], ans[11];
int b[1001];
int n, m, max;
 
int dp(int i)
{
       int j, k;
 
       for (j = 1; j < 1001; j++)
              b[j] = 9999;
 
       for (j = 1; j <= i; j++)
              b[a[j]] = 1;
       j = 0;
 
       do
       {
              j++;
 
              for (k = 1; k <= i; k++)
                     if (j > a[k] && b[j - a[k]] + 1 < b[j])
                            b[j] = b[j - a[k]] + 1;
 
       }while (b[j] <= m);
       return j;
}
 
void search(int i)
{
       int j, k;
 
       if (i > n)
       {
              if (dp(i - 1) - 1 > max)
              {
                     for (j = 1; j <= 10; j++)
                            ans[j] = a[j];
                     max = dp(i - 1) - 1;
              }
              return;
       }
       j = dp(i - 1);
 
       for (k = j ; k >= a[i - 1] + 1; k--)
       {
              a[i] = k;
              search(i + 1);
       }
}
 
int main()
{
 
       int i;
       scanf("%d%d", &m, &n);
 
       max = 0;
       a[1] = 1;
       search(2);
 
       for (i = 1; i <= n; i++)
              printf("%d ", ans[i]);
 
       printf("\n");
       printf("MAX=%d\n", max);
       return 0;
}