你们好,这是我今天演讲的目录,分Java,JavaScript,ABAP三门编程语言来说述。javascript
•JAD
•javap
•Java Decompiler
•Source Monitor
•Visual VM
•Refactor Menu in Eclipsejava
•Code inspector
•Refactor feature in AIE
•Code coverage编程
•ESLint for Fiori Apps
•Check Jenkins build log
•JSlint for Sublime Text 2
•Code check in WebIDE
•Profile in Chrome设计模式
看看stackoverflow上是怎么说的。安全
Java里定义常量的最佳实践:app
http://developer.51cto.com/ar...dom
Java里这两种定义常量的方法,哪一种更好?eclipse
package one; public interface Constants { String NAME = "孙悟空"; int BP = 10000; }
或编程语言
package two; public class Constants { public static final String NAME = "贝吉塔"; public static final int BP = 9000; }
为何咱们不该该在Java 接口中使用Array:函数
https://eclipsesource.com/blo...
避免Array的缘由之一:Array若使用不当,会形成性能问题
避免Array的缘由之一:Array若使用不当,会形成性能问题
避免Array的缘由之二:Array是面向过程编程领域的概念,使用Java面向对象的集合类,好比List,而不是Array
看个具体例子:
String[] array = { "乔布斯", "张小龙" }; List list = Arrays.asList( array ); System.out.println( list ); // 打印输出 [乔布斯, 张小龙] System.out.println( array ); // -> [Ljava.lang.String;@6f548414 list.equals( Arrays.asList( "乔布斯", "张小龙" ) ) // -> true array.equals( new String[] { "乔布斯", "张小龙" } ) // -> false
看出差距了吧?
Arrays不是类型安全的!
下面的代码能经过编译,可是运行时会报ArrayStoreException的异常:
Number[] numbers = new Integer[10]; numbers[0] = Long.valueOf( 0 );
而使用JDK的集合类好比List,就能在编译器即检测出这类错误。
function a() { console.log("I was called!"); return "Jerry"; } var b = a(), a;
而后执行下面的代码:
console.log(b);
会打印出Jerry
再看这段代码:
var d = (function c(){ return a(),a; })(); console.log(d);
会打印出:
I was called! function a() { console.log("I was called!"); return "Jerry"; }
再看这段代码呢?
(function() { var e = f = 1; })();
直接报错:Uncaught ReferenceError: f is not defined
var b = function(para) { return { doSomething: function() { console.log("hello: " + para); return para; } } } var a = 1, x = 3, y = 4, s s = a + b (x + y).doSomething() // 打印出 hello: 7 console.log(s) // 打印出 8 function test(i){ var result = i++; return result } console.log("test: " + test(3)) // 打印出undefined
s = function(x){ console.log("called: " + x ); return x} (1 + 2).toString() s = function(x){ console.log("called: " + x ); return x}(1 + 2).toString() // 打印出 called: 3
var bigFunction = function() { // big logic console.log("big logic"); // 这句话模拟咱们在一段很冗长的遗留代码里植入本身的新逻辑 } // 下面这种解决方案不会直接修改遗留函数自己,显得比较优雅 var _old = bigFunction; bigFunction = function() { if ( _old ) { _old(); } console.log("our own enhancement"); } bigFunction(); // 第三种解决方案采用了面向切片编程思想,显得更加高级 var bigFunction = function() { // big logic console.log("big logic"); } bigFunction = ( bigFunction || function() {} ).after( function() { console.log("our own logic"); }); bigFunction();
var append_doms = function() { var d = new Date(); // dirty code - nothing to do with application logic!!! for( var i = 0; i < 100000; i++) { var div = document.createElement( "div"); document.body.appendChild(div); } // dirty code - nothing to do with application logic!!! console.log(" time consumed: " + ( new Date() - d)); }; function test() { append_doms(); }
传统方案:在充满了业务逻辑的函数体里强行加入红色标准的搜集性能测试的工具代码,这个实现显得很丑陋:
var append_doms = function() { for( var i = 0; i < 100000; i++) { var div = document.createElement( "div"); document.body.appendChild(div); } }; var log_time = function( func, log_name) { return func = ( function() { var d; return func.before( function(){ d = new Date(); }).after( function(){ console.log( log_name + ( new Date() - d)); }); })(); }; function test() { log_time(append_doms, "consumed time: ")(); }
在调用真正的OData API以前,系统有大量的IF ELSE对API的输入参宿进行检查:
var send = function() { var value = input.value; if( value.length === '' ) { return false; } else if( value.length > MAX_LENGTH) { return false; } ... // lots of else else { // call OData API } }
更优雅的解决方案:
把这些不一样的检查规则封装到一个个JavaScript函数里,再把这些函数做为一个规则对象的属性:
var valid_rules = { not_empty: function( value ) { return value.length !== ''; }, max_length: function( value ) { return value.length <= MAX_LENGTH ; } }
实现一个新的检查函数,变量检查对象的属性,执行校验逻辑:
var valid_check = function() { for( var i in valid_rules ) { if ( vali_rules[i].apply( this, arguments) === false ) { return false; } } }
如今的OData调用函数很是优雅了:
var send = function( value ) { if ( valid_check( value ) === false ) { return; } // call OData API }
经过这种方式消除了IF ELSE。
另外一种经过职责链 Chain of Responsibility 的设计模式 design pattern消除IF ELSE分支的代码重构方式:
先看传统方式的实现:
// Priority: ActiveX > HTML5 > Flash > Form(default) function isActiveXSupported(){ //... return false; } function isHTML5Supported(){ //... return false; } function isFlashSupported(){ //... return false; }
好多的IF -ELSE啊:
var uploadAPI; if ( isActiveXSupported()) { // lots of initialization work uploadAPI = { "name": "ActiveX"}; } else if( isHTML5Supported()) { // lots of initialization work uploadAPI = { "name": "HTML5"}; } else if( isFlashSupported()) { // lots of initialization work uploadAPI = { "name": "Flash"}; } else { // lots of initialization work uploadAPI = { "name": "Form"}; } console.log(uploadAPI);
再看职责链设计模式的实现:
var getActiveX = function() { try { // lots of initialization work return { "name": "ActiveX"}; } catch (e) { return null; } } var getHTML5 = function() { try { // lots of initialization work return { "name": "HTML5"}; } catch (e) { return null; } }
代码整洁优雅:
var uploadAPI = getActiveX.after(getHTML5).after(getFlash).after(getForm)(); console.log(uploadAPI);
public class stringTest { public static void main(String[] args) { String userName = "Jerry"; String skill = "JS"; String job = "Developer"; String info = userName + skill + job; System.out.println(info); } }
用javap将上面的Hello World程序反编译出来学习:
要获取更多Jerry的原创文章,请关注公众号"汪子熙":