有一天,我在想如何从网站上获取图标,并在网站上更新图标时让它显示和更新,所以我编写了以下代码:
URL url2 = null;
boolean updateIcon = true;
try {
url2 = new URL("https://dl.dropboxusercontent.com/s/70rhm66myw8ay2v/Perception%20Logo.png");
} catch (MalformedURLException ex) {
updateIcon = false;
ex.printStackTrace();
}
if (updateIcon) {
System.out.println("[Perception] Icon updated.");
if (ComputerCheck.isWindows()) {
Image bimg = Toolkit.getDefaultToolkit().getImage(url2);
this.setIconImage(bimg);
} else if (ComputerCheck.isMac()) {
Application application = Application.getApplication();
Image image = Toolkit.getDefaultToolkit().getImage(url2);
application.setDockIconImage(image);
}
}它的工作效率是100%,但它会使启动时间慢得多。我在想我怎么才能优化这个。
发布于 2015-07-14 21:33:01
我会对这个代码进行重大的重构。我要做的第一件事是将图像检索移到一个单独的方法中,然后图像放置将变得“更简单”。
将您的代码与以下代码进行比较:
Image image = getRemoteLogo();
if (image != null) {
// Logo updated
updateLogo(image);
}这在很大程度上是在重新想象您正在做的事情,根据您的喜好,您可能会将空检查移到updateLogo中。
这样你就可以隐藏图像并摆脱国际海事组织..。在try-块之前的clunky空初始化:
private Image getRemoteLogo() {
try {
URL remoteUrl = new URL(Config.getRemoteLogoUrl());
return Toolkit.getDefaultToolkit().getImage(remoteUrl);
} catch (MalformedURLException ex) {
// this is the point where you can slap the programmer :D
ex.printStackTrace();
return null;
}
}这整齐地将硬编码的dropbox隐藏在(未进一步指定)配置中,这允许更改徽标位置而不必替换类。
此外,它还清晰地抽象出图像加载,并在错误情况下具有清晰的行为。它还去掉了多余的布尔标志。
updateLogo(Image)是历史记录,您可以执行ComputerCheck并相应地设置图像。
创业放缓是你必须忍受的事情。
哦,我稍微更改了变量名。如果可能的话,将来的维护人员(包括您自己)可能无法确定哪个数字对应于哪个URL :)
发布于 2015-07-15 07:58:11
就我个人而言,我要比前面的答案更进一步。我讨厌空检查,因此将空作为参数和/或返回值传递。我这么做的唯一原因是,如果是在一个性能非常重要的环境中。这里的情况似乎并非如此。所以我的看法是:
public void tryToUpdateLogo(URL remoteUrl)
{
try{
updateLogo(remoteURL);
}
catch(MalformedURLException, UnknownSystemException ex) {
ex.printStackTrace();
// HANDLE ERROR
}
}
private void updateLogo() throws MalformedURLException
{
Image logo = getLogoFromURL(URL remoteUrl);
UpdateLogo(logo);
}
private Image getLogoFromURL(URL remoteURL)
{
return Toolkit.getDefaultToolkit().getImage(remoteUrl);
}
private void updateLogo(Image logo) throws UnknownSystemException
{
System.out.println("[Perception] Icon updated.");
if(ComputerCheck.isWindows())
this.setIconImage(logo);
else if(ComputerCheck.isMac())
getMACApplication().setDockIconImage(logo);
else
throw new UnknownSystemException();
}此代码基于“错误处理是一种响应性”的前提,这是由于SRP (单响应性原则)应该与代码分离,如RobertC.Martins 清洁代码中所描述的那样。
https://codereview.stackexchange.com/questions/96951
复制相似问题