`
王者之剑
  • 浏览: 196512 次
  • 性别: Icon_minigender_1
  • 来自: 湖北
社区版块
存档分类
最新评论

不要把简单的事情搞得N复杂(例1)

阅读更多

题目:用java写一个程序,打印如下图形

*

**

***

****

*****

请思考三钞钟,写下你的程序,然后看答案。

 

 

 

我刚毕业时的答案:

package com.albertsong;

/**
 * 
 * @author Albert
 *
 */
public class PrintStar {

	public static void main(String[] args) {
		for(int i=0;i<5;i++){
			for(int j=0;j<i+1;j++){
				System.out.print("*");
			}
			System.out.println();
		}
	}

}

现在的答案:

 

package com.albertsong;

/**
 *
 * @author Albert
 *
 */
public class PrintStar {

    public static void main(String[] args) {
        System.out.println("*\n**\n***\n****\n*****\n");
    }

}
 

 

看到这里,同学们肯定有话要说了。

 

我也有话要说,我想说的是:“与人方便,自己方便”。

 

仅就这个题目而言,显然第二个程序要好得多,它实现了和第一个程序一样的功能。无论从代码行数,还是容易理解的程度,第一个程序都无法与之相比。

 

讨论1:

M:第一个程序更容易修改,扩展,适应性更强。如果要打印下面的图形,

*

**

***

...

*****...***(注:第100行有100个)

改第二个程序还不累死?

A:如果第二天客户要打印的是下面这个图形呢?

*

**

***

* **

*** *

M:变态!%^&*

A:没有变态的客户,只有懒惰的程序员。

 

 

讨论2:

1)

A:到目前为止,这样的图形最多有几行?

G:十行吧

A:随着贵公司的发展,有可能到一百行吗?

G:当然是希望越多越好,但按公司目前的情况,十年之内不太可能。

G:但我们有可能调整业务,那时图形可能会变。

A:变了的话应该还是有一定规律的吧

G:那当然,也不能胡乱调阿,结果基本上不是正三角形就是倒三角形,最多会变成菱形。

2)

A:需不需要能够打印一百行,或者一千行的?

G:不需要,这个图还是昨天拍脑袋出来的,先给我打出来看看效果

A:会不会有中间哪儿少个*号的情况

G:你先别管这么多,先把目前这个问题解决了,中间会不会少*号这会儿还不知道。

 

讨论3:

T:本来想招个学过Java for循环的程序员阿

A:我们下回是不是把题目改成“用java写一个程序,打印如下图形(请使用for循环)。

 

现在到底哪个程序好,应该比较清楚了吧。

“不要把简单的事情搞得N复杂”,这句话是针对结果,而不是针对过程的准则。

前几天在闲聊中写道:不要解决不存在的问题,我想更为准确的说法是:不要解决了不存在的问题。

 

路人甲:哦,懂了,但是,这和前面说到的“与人方便,自己方便”有什么关系?

A:没有一毛钱的关系,如果“认真分析需求,为客户着想”这种理念高尚得让你有点儿难受的话,不妨想想,这样做,实际上可以为自己省下看毛片的时间呀,对不?

 

42
7
分享到:
评论
44 楼 pufan 2009-04-15  
rubynroll 写道

要我说,还是curl放心.就一行代码能搞定的事,整那么多干啥?

搭个鸡窝怎么都无所谓,要盖大楼就斟酌斟酌了。
43 楼 wangxin0072000 2009-04-15  
绝对抬杠贴。
42 楼 rubynroll 2009-04-15  
pufan 写道

多说无用,还是上代码
Java代码 public class ThreadUtilities {      private static final ExecutorService pool = Executors.newSingleThreadExecutor();      public static void notify(final String url) {          pool.submit(new Callable&lt;Void>() {                @Override              public Void call() throws Exception {                  URL l = new URL(url);                  HttpURLConnection connection = (HttpURLConnection) l.openConnection();                  connection.setConnectTimeout(5000);                  connection.setReadTimeout(30000);                  connection.connect();                  return null;              }          });      }  }  public class ThreadUtilities {
private static final ExecutorService pool = Executors.newSingleThreadExecutor();
public static void notify(final String url) {
pool.submit(new Callable&lt;Void>() {

@Override
public Void call() throws Exception {
URL l = new URL(url);
HttpURLConnection connection = (HttpURLConnection) l.openConnection();
connection.setConnectTimeout(5000);
connection.setReadTimeout(30000);
connection.connect();
return null;
}
});
}
}

这段代码在极端情况下会存在n个Callable对象,curl方案会存在n个curl进程(线程)。

那个方案比较放心,大家评一评。


要我说,还是curl放心.就一行代码能搞定的事,整那么多干啥?




41 楼 pufan 2009-04-15  
night_stalker 写道

肉饼的方案出了意外能处理,你的出了意外没法处理。(这是10行代码么?还不包括调用呢……)建议你写个监控脚本或者写个监控程序。

出了意外最多log一下,加上try catch及调用也就是十行左右的代码。

为什么要监控呢,监控什么?通知搜索引擎失败就失败了,无所谓。

40 楼 王者之剑 2009-04-15  
pufan 写道

这段代码在极端情况下会存在n个Callable对象,curl方案会存在n个curl进程(线程)。

那个方案比较放心,大家评一评。

但是javaeye网站是用ruby做的阿,用java写个程序还得用ruby去调用。
39 楼 night_stalker 2009-04-15  
pufan 写道

这段代码在极端情况下会存在n个Callable对象,curl方案会存在n个curl进程(线程)。
那个方案比较放心,大家评一评。

肉饼的方案出了意外能处理,你的出了意外没法处理。
(这是10行代码么?还不包括调用呢……)

建议你写个监控脚本或者写个监控程序。
38 楼 pufan 2009-04-15  
多说无用,还是上代码
public class ThreadUtilities {
	private static final ExecutorService pool = Executors.newSingleThreadExecutor();
	public static void notify(final String url) {
		pool.submit(new Callable<Void>() {

			@Override
			public Void call() throws Exception {
				URL l = new URL(url);
				HttpURLConnection connection = (HttpURLConnection) l.openConnection();
				connection.setConnectTimeout(5000);
				connection.setReadTimeout(30000);
				connection.connect();
				return null;
			}
		});
	}
}

这段代码在极端情况下会存在n个Callable对象,curl方案会存在n个curl进程(线程)。

那个方案比较放心,大家评一评。
37 楼 night_stalker 2009-04-15  
to pufan:
你可能认为你的做法很完美,发射后不用管了,ok,恭喜你,你推翻了图灵机停机判定定理!
36 楼 pufan 2009-04-15  
night_stalker 写道

你分明是双重标准,curl你不放心,脚本你不放心,ruby你不放心,操作系统你不放心,估计你对机房管理员也不放心 ……

一条curl当然放心,但是n条呢,nn条呢。
35 楼 night_stalker 2009-04-15  
pufan 写道

你直接说用java不放心得了,嗯,目前最强的企业级开发语言不够您放心。

你分明是双重标准,curl你不放心,脚本你不放心,ruby你不放心,操作系统你不放心,估计你对机房管理员也不放心 ……
34 楼 pufan 2009-04-15  
night_stalker 写道

pufan 写道
java(单线程+队列):十行代码(放心运行,无需监控报警)一点都不能放心,你得把整个 jvm 运行时仔细检查一遍才行。不…… 很多遍都不够……

你直接说用java不放心得了,嗯,目前最强的企业级开发语言不够您放心。
33 楼 night_stalker 2009-04-15  
pufan 写道

java(单线程+队列):十行代码(放心运行,无需监控报警)

一点都不能放心,你得把整个 jvm 运行时仔细检查一遍才行。
不…… 很多遍都不够……
32 楼 pufan 2009-04-15  
监控另加报警
王者之剑 写道

你说的问题,确实存在,但不是robbin要解决的问题。就好比robbin说我骑自行车上班挺好的。你也不管人家上班到底有多远,居住附近的交通状况,就在那儿列举坐公汽或者坐地铁或者开私家车的好处。并且宣布:坐地铁上班是最好的,又快又经济,我上班就是坐地铁,骑自行车还不累死。请仔细看我的文章,前两个字就是“题目”,robbin的第二个回贴也严格地限定了问题的所在。

其实我想表达的在于对简单的认知,是本质上简单还是形式上简单

对于前者要推崇,但对于后者就要洞悉简单下所隐藏的复杂。
31 楼 potian 2009-04-15  
You Aren'T Gonna Need It
30 楼 王者之剑 2009-04-15  
pufan 写道

night_stalker 写道
一行代码的健壮度是十行代码的十倍。你说的问题只是你想象中的,你真实遇到过么?

那要看一行代码调用了几行代码,麻烦你把curl的代码行数算一下。

生产环境中确实遇到过,不过不是调用curl。


你说的问题,确实存在,但不是robbin要解决的问题。

就好比robbin说我骑自行车上班挺好的。
你也不管人家上班到底有多远,居住附近的交通状况,就在那儿列举坐公汽或者坐地铁或者开私家车的好处。
并且宣布:坐地铁上班是最好的,又快又经济,我上班就是坐地铁,骑自行车还不累死。

请仔细看我的文章,前两个字就是“题目”,robbin的第二个回贴也严格地限定了问题的所在。
29 楼 pufan 2009-04-15  
night_stalker 写道

一行代码的健壮度是十行代码的十倍。你说的问题只是你想象中的,你真实遇到过么?

那要看一行代码调用了几行代码,麻烦你把curl的代码行数算一下。

生产环境中确实遇到过,不过不是调用curl。
28 楼 Army 2009-04-15  
哈哈,这样是很爽!
27 楼 night_stalker 2009-04-15  
pufan 写道

够简单,但不见得健壮。

大并发的情况,特别是当网络拥挤时,http请求很可能造成线程占用过多从而引起系统资源不足。

用ruby,curl看上去简单,但实现是怎样的谁知道:是后台单线程还是多线程、是否和其他模块共用线程池等等,这些都可能会引发潜在问题。

如果用java,做法就是将请求放入队列,后台单线程轮询执行(看起来挺复杂,其实就是线程池+URL十行代码搞定),虽然没ruby代码少,但用得放心不是。


一行代码的健壮度是十行代码的十倍。

你说的问题只是你想象中的,你真实遇到过么?
26 楼 pufan 2009-04-15  
另外补充一下,java的socket默认超时是0(永远不超时)。
25 楼 王者之剑 2009-04-15  
pufan 写道

大并发的情况下,多线程执行堵塞IO是有隐患的,这是一个基本常识,解决方式无非有
1)用非阻塞IO替代
2)实时需求不高的情况下,用单线程队列轮训

交给操作系统就健壮,估计很多人有这种误区,难道操作系统不是代码写出来的,更何况一个curl命令了。

请教一下,何谓大并发?
或者说大到什么程度,这个隐的患就出来了?
或者说你曾经实践过什么样的案例?

然后再看看发这个ping请求是不是需要用你的方法。

相关推荐

    神奇宝贝(PokemonGo)基于Jetpack+MVVM+Repository设计模式+Data.zip

    神奇宝贝(PokemonGo)基于Jetpack+MVVM+Repository设计模式+Data

    用于试用 Dev Containers 的 Python 示例项目.zip

    用于试用 Dev Containers 的 Python 示例项目试用开发容器Python开发容器是一个具有明确定义的工具/运行时堆栈及其先决条件的运行容器。您可以使用GitHub Codespaces或Visual Studio Code Dev Containers试用开发容器。这是一个示例项目,您可以通过几个简单的步骤尝试任一选项。我们还有各种其他vscode-remote-try-*示例项目。注意如果您已经有代码空间或开发容器,则可以跳至“要尝试的事情”部分。设置开发容器GitHub Codespaces请按照以下步骤在 Codespace 中打开此示例单击代码下拉菜单。单击Codespaces选项卡。单击主屏幕上的“创建代码空间”。有关创建代码空间的更多信息,请访问GitHub 文档。VS Code 开发容器如果您已安装 VS Code 和 Docker,则可以单击上方或此处的徽章开始使用。单击这些链接将导致 VS Code 根据需要自动安装 Dev Containers 扩展,将源代码克隆到容器卷中,并启动开发容器以供使用。按

    springboot vue3前后端分离.zip

    springboot vue3前后端分离

    数学建模-神经网络算法 lecture 11 线性随机系统辨识示例 共9页.pptx

    数学建模-神经网络算法 lecture 11 线性随机系统辨识示例 共9页.pptx

    优质粳稻生产技术规程.docx

    优质粳稻生产技术规程.docx

    所有算法均在 Python 3 中实现,是 hacktoberfest2020 的一个项目 - 没有针对 hacktoberfest 2021 的问题或 PR.zip

    算法 - Python 目录灵感与动力贡献指南从这里开始所有算法均用 Python 3 实现(用于教育)这些实现仅用于学习目的。如果您想贡献更有效的解决方案,请随时打开问题并提交您的解决方案。灵感你可以在LeetCode 算法中寻找要实现的算法若要贡献,请确保算法尚未提交!请确保在您的 PR 中添加问题编号。贡献指南文件夹和文件请确保你的文件位于 -Folder 中LeetCode,并且命名如下 0001_TwoSum.py-> LeetCode 问题的 4 位数字、下划线、LeetCodeName开放问题当您打开问题时,请确保问题尚未实现(查看代码/Leetcode 以获取问题编号)。现有问题打开的问题将被关闭,并且对此问题的 PR 被标记为垃圾邮件 。打开问题的贡献者将被优先分配到该问题。如果大约 7 天内没有 PR,则问题将分配给另一个贡献者。拉取请求只有与问题相结合并符合命名约定(参见文件夹和文件)的 Pull 请求才会被合并!如果 PR 中没有加入问题,您的 PR 将被标记为垃圾邮件并关闭。如果您的代码未通

    用于接收和交互来自 Slack 的 RTM API 的事件的框架.zip

    用于接收和交互来自 Slack 的 RTM API 的事件的框架python-rtmbot此项目不再处于积极开发阶段。如果您刚刚开始,我们建议您先查看Python SDK。如果您一直在使用此项目,我们只会解决关键问题(例如安全问题),但我们建议您计划迁移到 Python SDK。您仍然可以提交问题并向我们寻求帮助! 如果您有兴趣在未来维护此软件包,请联系我们 一个用 Python 编写的 Slack 机器人,通过 RTM API 连接。Python-rtmbot 是一个机器人引擎。任何了解Slack API和 Python的人都应该熟悉插件架构。配置文件格式为 YAML。该项目目前处于 1.0 之前的版本。因此,您应该计划不时进行重大更改。对于任何重大更改,我们将在 1.0 之前的版本中调整次要版本。(例如 0.2.4 -> 0.3.0 意味着重大更改)。如果稳定性很重要,您可能希望锁定特定的次要版本)与 webhook 的一些区别不需要网络服务器来接收消息可以回复用户的直接消息以 Slack 用户(或机器人)身份登录机器人用户必须被邀请加入频道

    基于django的音乐推荐系统.zip

    基于django的音乐推荐系统.zip

    北京理工大学<Python机器学习应用>超详细学习笔记和代码注释(未完待续).zip

    北京理工大学<Python机器学习应用>超详细学习笔记和代码注释(未完待续)

    kernel-5.15-rc7.zip

    kernel-5.15-rc7.zip

    神经网络-DenseNet网络结构

    神经网络-DenseNet网络结构

    rbac组件(基于角色的权限控制).zip

    rbac组件(基于角色的权限控制)

    C++ Vigenère 密码(解密代码)

    C++ Vigenère 密码(解密代码)

    数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 杭州消防设置-对杭州市消防局设置的研究 共8页.pdf

    数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 杭州消防设置-对杭州市消防局设置的研究 共8页.pdf

    老年用品产品推广目录分类表.docx

    老年用品产品推广目录分类表.docx

    毕设源码-基于Python的期货程序化交易系统的设计与实现_jhypi-期末大作业+说明文档.rar

    本项目是基于Python的期货程序化交易系统的设计与实现,旨在为计算机相关专业学生提供一个实践性强、贴近实际应用场景的项目案例。通过这一项目,学生们能够深入了解程序化交易的基本原理和实现方法,同时锻炼自身的编程技能、数据分析能力以及金融市场的洞察力。 项目的主要功能包括:自动收集和处理市场数据、基于预设策略进行交易决策、实时执行交易指令、监控交易风险以及生成详细的交易报告。系统采用模块化设计,主要包括数据采集模块、策略执行模块、交易执行模块和风险管理模块,各个模块之间通过明确的接口进行交互。项目采用的编程语言为Python,利用其强大的数据处理库和机器学习库,保证了系统的灵活性和扩展性。开发这一项目的目的是让学生们在实践中学习和掌握程序化交易的核心技术,提升其在金融科技领域的就业竞争力。

    基于java的校园失物招领平台设计与实现.docx

    基于java的校园失物招领平台设计与实现.docx

    Javascript Ninja 课程.zip

    Javascript Ninja 课程JavaScript Ninja 课程Inscreva-se agora mesmo e ganhe 10% de desconto!Como tirar dúvidas sobre 或 conteúdo do curso访问问题页面Pesquise nas发出abertas e fechadas, se a mesma dúvida já foi postadaSe não foi, crie uma nova issues , coloque um titulo que tenha a ver com a sua dúvida, e descreva-a com o maior nível detalhes possíveis, para que possamos te ajudar:)摘要Veja o sumário completo do curso aqui。赞同!:D

    通过示例在 Python 中解释 SOLID 原则 .zip

    solid.python通过示例在 Python 中解释SOLID 原则。单一职责原则开放/封闭原则里氏替换原则接口隔离原则依赖倒置原则

    公交信息在线查询系统 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程.zip

    公交信息在线查询系统 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程 项目启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS

Global site tag (gtag.js) - Google Analytics