小编Pét*_*rök的帖子

为什么还没有接受函数式编程呢?

我已经阅读了一些关于声明/函数编程(语言)的文章,尝试过Haskell以及自己编写的文本.从我所看到的,函数式编程比传统的命令式风格有几个优点:

  • 无国籍计划; 无副作用
  • 并发; 采用不断增长的多核技术,发挥得非常好
  • 程序通常较短,在某些情况下更容易阅读
  • 生产力提高(例如:Erlang)

  • 命令式编程是一个非常古老的范例(据我所知),可能不适合21世纪

为什么使用功能语言的公司或程序仍然如此"罕见"?

为什么在查看函数式编程的优点时,我们仍在使用命令式编程语言?

也许它在1990年还为时尚早,但今天呢?

functional-programming

197
推荐指数
11
解决办法
6万
查看次数

继承与构成的区别

组成和继承是一样的吗?如果我想实现组合模式,我该如何在Java中实现?

java oop inheritance composition

187
推荐指数
7
解决办法
21万
查看次数

幼儿园的职业日:如何在20分钟内演示编程?

原始问题

我被邀请到我大女儿的幼儿园小组谈话并回答孩子们关于我职业的问题.该组有26名4-6岁的孩子,另外还有3名教师,他们对编程和IT本身有任何相关的恐惧,但他们大胆地学习新的技巧.我会有大约20-30分钟,没有投影仪或任何东西.他们有一台旧电脑,看起来可能是486,我甚至不确定它是否正常运行(更新:它不是).

我的研究发现了很好的早期线程,有很多好的提示:

我的情况与上述情况不同:后者与年龄较大的儿童有关,而第一种情况则是与单个孩子(或老年人)交谈 - 一组20人是完全不同的挑战.

我怎样才能以有趣的方式教孩子们和他们的老师有关编程的知识?


基于答案的计划

感谢所有惊人的答案,伙计:-)我认为接受单一答案并不合理,但我最喜欢Jim,就像大多数SOers显然那样.然而,许多其他答案包含有用的提示和想法(其中一些我肯定会在未来的职业生涯中用于学校......).

我整理了一个粗略的计划:

  1. 简要解释一下编程是什么,就像在这个答案中一样.
  2. 告诉计算机无处不在,并与孩子们一起收集示例(如下面的几个答案所示).
  3. 吉姆和三明治一起演讲.
  4. 如果时间允许,进一步构建:
    • 解释说,计算机的优势在于它们能够准确地记住它们曾经被教过的东西(并通过准备第二个三明治,重复第一次尝试的所有错误来证明它)
    • 第二轮尝试修复过程中的错误
    • 解释循环的概念:你可以让计算机n用一条指令准备三明治

这是我的计划 - 我很确定它会变得非常不同,所以我会根据情况即兴发挥.演讲安排在大约2周的时间内 - 我将在事后更新帖子,并告诉它实际上是怎么回事......


结果

最后演示的那一天到了......简而言之,一切都很顺利,这是一个巨大的成功:-)

这一次,这群人变得非常焦躁和精力充沛,所以谈话偶尔会变得有些混乱.我不得不缩短它并进入Big Sandwich Maker Show.正如吉姆所说,孩子们喜欢它.

但是有一种不可预见的副作用:在第一片面包最终准备好之后,每个人都想吃!所以有一段时间 - 我试图跟上对话并解释更多关于节目的问题 - 我们不得不与幼儿园老师安装一种紧急服务线来制作大量的果酱面包并喂饱饥饿的人群(这只是一半)早餐后一小时,记录:-).然后我们用完了面包,这显然意味着演示的结束.孩子们注意到可怜的电脑踩到了一块破坏了袜子的橘子酱后,最大的一阵笑声爆发了:-)

老师们自己也给人留下了非常深刻的印象 - 从反馈来看,这是迄今为止这个小组中最好,最有趣的职业日.再次感谢大家的好主意!

可以改进的事情(下次):

  • 当我问"你觉得电脑是聪明的吗?"时,我很惊讶大多数人回答"不".然后我问谁认为电脑很聪明,为什么.然而,我忽略了问谁认为计算机是愚蠢的,为什么 - 因此我认为我错过了一些可能有趣的答案.
  • 邀请孩子们围着桌子让他们积极参与......但有时可能有点过于积极.面包切片开始从餐桌上消失,一些观众模仿电脑,就像将自己的手指浸入黄油和橘子酱中一样:-)所以最好保持一定的距离.
  • 为了控制饥肠辘辘的人群,应该事先清楚地告诉孩子:"你可以吃掉所有的面包,但只能示威之后!"

但总的来说,我对结果非常满意.而且我相信孩子们得到了核心信息:作为一名程序员,如果你避免造成混乱,你可以制作你的面包(即使是橘子酱:-)

children

186
推荐指数
6
解决办法
3万
查看次数

Junit:拆分集成测试和单元测试

我继承了Junit测试的负载,但是这些测试(除了大多数不工作之外)是实际单元测试和集成测试(需要外部系统,db等)的混合.

所以我试图想出一种方法来实际将它们分开,这样我就可以很好地快速运行单元测试,然后进行集成测试.

选项是......

  1. 将它们拆分为单独的目录.

  2. 移至Junit4(从v3开始)并注释类以将它们分开.

  3. 使用文件命名约定来告诉类是什么,即AdapterATest和AdapterAIntergrationTest.

3存在Eclipse可以选择"在所选项目/包或文件夹中运行所有测试"的问题.因此,只需运行集成测试就很难了.

2:冒着开发人员可能开始在单元测试类中编写集成测试的风险,它只会变得混乱.

1:似乎是最好的解决方案,但我的直觉说必须有一个更好的解决方案.

所以这就是我的问题,你如何分解集成测试和适当的单元测试?

testing junit integration-testing unit-testing junit4

124
推荐指数
6
解决办法
5万
查看次数

批处理文件中的字符串替换

我们可以使用以下命令替换批处理文件中的字符串

set str="jump over the chair"
set str=%str:chair=table%
Run Code Online (Sandbox Code Playgroud)

这些线条工作正常,并将字符串"跳过椅子"更改为"跳过桌子".现在我想用一些变量替换字符串中的"chair"一词,我不知道该怎么做.

set word=table
set str="jump over the chair"
??
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

command-line batch-file

92
推荐指数
2
解决办法
18万
查看次数

在IntelliJ中重新排序Java类方法的简单方法?

有没有比在IntelliJ中的类源文件中重新排序方法更简单的方法,而不是手动剪切和粘贴代码?现在我经常在重构遗留代码时需要这个,例如在源代码中移动相关的方法.

在Eclipse AFAIK中,有一个类似于IntelliJ的Structure视图的视图,我可以在其中拖放方法.但是,这在IntelliJ中不起作用,我也无法从其帮助中找到任何提示.

我使用IntelliJ 9.0.2是具体的.

java methods refactoring intellij-idea

69
推荐指数
5
解决办法
2万
查看次数

单一责任原则与贫血领域模式反模式

我正处于一个非常重视单一责任原则的项目中.我们有很多小班,事情很简单.但是,我们有一个贫血的领域模型 - 我们的任何模型类都没有行为,它们只是属性包.这不是对我们设计的抱怨 - 它实际上看起来效果很好

在设计评审期间,只要将新行为添加到系统中,SRP就会被引出,因此新行为通常会在新类中结束.这使得事情很容易被单元测试,但我有时会感到困惑,因为它感觉就像将行为拉出相关的地方.

我正在努力提高我对如何正确应用SRP的理解.在我看来,SRP反对添加与一个对象共享相同上下文的业务建模行为,因为该对象不可避免地最终要么做多个相关的事情,要么做一件事但是要知道改变形状的多个业务规则其产出.

如果是这样,那么感觉最终结果是一个贫血领域模型,这在我们的项目中肯定是这样.然而,贫血领域模型是一种反模式.

这两个想法可以共存吗?

编辑:一些上下文相关的链接:

SRP - http://www.objectmentor.com/resources/articles/srp.pdf
贫血领域模型 - http://martinfowler.com/bliki/AnemicDomainModel.html

我不是那种喜欢找先知并遵循他们所说的福音的开发者.所以我没有提供这些链接,作为说明"这些是规则"的方式,只是作为两个概念的定义来源.

oop solid-principles

58
推荐指数
4
解决办法
4969
查看次数

变量可能没有初始化错误

当我尝试编译这个:

public static Rand searchCount (int[] x) 
{
    int a ; 
    int b ; 

    ...   

    for (int l= 0; l<x.length; l++) 
    {
        if (x[l] == 0) 
        a++ ;
        else if (x[l] == 1) 
        b++ ;
    }

    ...   

}
Run Code Online (Sandbox Code Playgroud)

我收到这些错误:

Rand.java:72: variable a might not have been initialized
                a++ ;
                ^
Rand.java:74: variable b might not have been initialized
                b++ ;
                ^
2 errors
Run Code Online (Sandbox Code Playgroud)

在我看来,我在方法的顶部初始化它们.什么出错了?

java variables initialization

58
推荐指数
5
解决办法
32万
查看次数

Liskov替换原则 - 没有覆盖/虚拟方法?

我对Liskov替换原则的理解是,对于派生类,基类的某些属性是真的或某些实现的基类行为.

我想这意味着当一个方法在基类中定义时,它永远不应该在派生类中被覆盖 - 因为那么替换基类而不是派生类会产生不同的结果.我想这也意味着,拥有(非纯)虚拟方法是件坏事吗?

我想我可能对这个原则有错误的理解.如果我不这样做,我不明白为什么这个原则是好的做法.谁可以给我解释一下这个?谢谢

liskov-substitution-principle design-principles solid-principles

57
推荐指数
4
解决办法
6456
查看次数

将set设置为另一组

是否有更好的方法将集合附加到另一个集合而不是迭代每个元素?

我有 :

set<string> foo ;
set<string> bar ;

.....

for (set<string>::const_iterator p = foo.begin( );p != foo.end( ); ++p)
    bar.insert(*p);
Run Code Online (Sandbox Code Playgroud)

有没有更有效的方法来做到这一点?

c++ insert set

50
推荐指数
2
解决办法
4万
查看次数