免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
代碼重構(gòu)那些事兒

大家好,這是我今天演講的目錄,分Java,JavaScript,ABAP三門編程語(yǔ)言來(lái)講述。

Java

·JAD
·javap
·Java Decompiler
·Source Monitor
·Visual VM
·Refactor Menu in Eclipse

ABAP

·Code inspector
·Refactor feature in AIE
·Code coverage

JavaScript

·ESLint for Fiori Apps
·Check Jenkins build log
·JSlint for Sublime Text 2
·Code check in WebIDE
·Profile in Chrome

在方法里引入一個(gè)布爾類型的參數(shù)控制方法的行為,這種做法正確嗎?

看看stackoverflow上是怎么說(shuō)的。

Java里定義常量的最佳實(shí)踐:

http://developer.51cto.com/art/201509/492085.htm

Java里這兩種定義常量的方法,哪種更好?

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;}

為什么我們不應(yīng)該在Java 接口中使用Array:

https://eclipsesource.com/blogs/2014/04/11/3-good-reasons-to-avoid-arrays-in-java-interfaces

避免Array的原因之一:Array若使用不當(dāng),會(huì)造成性能問(wèn)題

避免Array的原因之一:Array若使用不當(dāng),會(huì)造成性能問(wèn)題


避免Array的原因之二:Array是面向過(guò)程編程領(lǐng)域的概念,使用Java面向?qū)ο蟮募项?,比如List,而不是Array

看個(gè)具體例子:

String[] array = { "喬布斯", "張小龍" };List list = Arrays.asList( array );System.out.println( list );// 打印輸出 [喬布斯, 張小龍]System.out.println( array );// -> [Ljava.lang.String;@6f548414list.equals( Arrays.asList( "喬布斯", "張小龍" ) )// -> truearray.equals( new String[] { "喬布斯", "張小龍" } )// -> false

看出差距了吧?

Arrays不是類型安全的!

下面的代碼能通過(guò)編譯,但是運(yùn)行時(shí)會(huì)報(bào)ArrayStoreException的異常:

Number[] numbers = new Integer[10];numbers[0] = Long.valueOf( 0 ); 

而使用JDK的集合類比如List,就能在編譯器即檢測(cè)出這類錯(cuò)誤。

Javascript里有趣的逗號(hào)

function a() {  console.log("I was called!");  return "Jerry";}var b = a(), a;

然后執(zhí)行下面的代碼:

console.log(b);

會(huì)打印出Jerry

再看這段代碼:

var d = (function c(){  return a(),a;})();console.log(d);

會(huì)打印出:

I was called!function a() {  console.log("I was called!");  return "Jerry";}

再看這段代碼呢?

(function() {    var e = f = 1;})();

直接報(bào)錯(cuò):Uncaught ReferenceError: f is not defined

JavaScript里有趣的分號(hào)

var b = function(para) {  return {  doSomething: function() {  console.log("hello: " + para);  return para;  }  }}var a = 1, x = 3, y = 4, ss = a + b(x + y).doSomething() // 打印出 hello: 7console.log(s) // 打印出 8function test(i){  var result = i++;  return  result}console.log("test: " + test(3)) // 打印出undefined

繼續(xù)看這段代碼

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

小技巧 - 如何把您自己增強(qiáng)邏輯植入到legacy遺留代碼中

var bigFunction = function() {      // big logic      console.log("big logic"); // 這句話模擬我們?cè)谝欢魏苋唛L(zhǎng)的遺留代碼里植入自己的新邏輯}// 下面這種解決方案不會(huì)直接修改遺留函數(shù)本身,顯得比較優(yōu)雅var _old = bigFunction;bigFunction = function() {    if ( _old ) {         _old();    }    console.log("our own enhancement");}bigFunction();// 第三種解決方案采用了面向切片編程思想,顯得更加高級(jí)var bigFunction = function() {  // big logic  console.log("big logic");}bigFunction = ( bigFunction || function() {} ).after( function() {     console.log("our own logic");});bigFunction();

如何優(yōu)雅的在一個(gè)函數(shù)里增添性能測(cè)試統(tǒng)計(jì)的工具代碼

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();}

傳統(tǒng)方案:在充滿了業(yè)務(wù)邏輯的函數(shù)體里強(qiáng)行加入紅色標(biāo)準(zhǔn)的搜集性能測(cè)試的工具代碼,這個(gè)實(shí)現(xiàn)顯得很丑陋:

再看看采用面向切片編程思路的解決方案:AOP - Aspect Oriented Programming

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: ")();}

如何避免代碼中大量的IF - ELSE 檢查

在調(diào)用真正的OData API之前,系統(tǒng)有大量的IF ELSE對(duì)API的輸入?yún)⑺捱M(jìn)行檢查:

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     }}

更優(yōu)雅的解決方案:

把這些不同的檢查規(guī)則封裝到一個(gè)個(gè)JavaScript函數(shù)里,再把這些函數(shù)作為一個(gè)規(guī)則對(duì)象的屬性:

var valid_rules = {      not_empty: function( value ) {         return value.length !== '';      },      max_length: function( value ) {         return value.length <= MAX_LENGTH  ;      } }

實(shí)現(xiàn)一個(gè)新的檢查函數(shù),變量檢查對(duì)象的屬性,執(zhí)行校驗(yàn)邏輯:

var valid_check = function() {     for( var i in valid_rules ) {          if ( vali_rules[i].apply( this, arguments) === false ) {                return false;          }     }}

現(xiàn)在的OData調(diào)用函數(shù)非常優(yōu)雅了:

var send = function( value ) {       if ( valid_check( value ) === false ) {             return;       }      // call OData API}

通過(guò)這種方式消除了IF ELSE。

另一種通過(guò)職責(zé)鏈 Chain of Responsibility 的設(shè)計(jì)模式 design pattern消除IF ELSE分支的代碼重構(gòu)方式:

先看傳統(tǒng)方式的實(shí)現(xiàn):

// 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);

再看職責(zé)鏈設(shè)計(jì)模式的實(shí)現(xiàn):

Chain of Responsibility

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;  }}

代碼整潔優(yōu)雅:

var uploadAPI = getActiveX.after(getHTML5).after(getFlash).after(getForm)();console.log(uploadAPI);

Java中的String

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程序反編譯出來(lái)學(xué)習(xí):

要獲取更多Jerry的原創(chuàng)文章,請(qǐng)關(guān)注公眾號(hào)"汪子熙

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
利用HTML5開(kāi)發(fā)Android技巧
各大互聯(lián)網(wǎng)公司2014前端筆試面試題–JavaScript篇 – 碼農(nóng)網(wǎng)
JavaScript初學(xué)者應(yīng)知的24條最佳實(shí)踐(譯)
閑談異步調(diào)用“扁平”化
原生安卓開(kāi)發(fā)app的框架frida常用關(guān)鍵代碼定位
JS匿名自執(zhí)行函數(shù)(IIFE)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服