2016-09-28 40 views
0

我正在嘗試Spring Rest服務教程(https://spring.io/guides/gs/rest-service/),並做了自己的修改以反轉在REST服務調用中給出的給定名稱。我正在努力確定哪種書寫ReverseString方法更好的OOP設計。這裏是我的Name類和相應的ReverseString方法裏面的兩個變體。哪一個更好的面向對象方法的OOP設計

public class Name { 
private String name; 


public Name(String name){ 
    this.name = name; 

} 


public String getName(){ 

    return name; 
} 

public void setName(String name){ 
    this.name = name; 
} 

// Is this good OOP design? 
public static Name ReverseName(Name myName){ 
     myName.setName(new StringBuilder(myName.getName()).reverse().toString()); 

return myName; 

} 

} 

-------- OR -------------

public class Name { 
    private String name; 


    public Name(String name){ 
    this.name = name; 

} 


public String getName(){ 

    return name; 
} 

public void setName(String name){ 
    this.name = name; 
} 


public void ReverseName(){ 
     this.setName(new StringBuilder(this.getName()).reverse().toString()); 



} 

} 

對於這裏更加清楚是我的春節控制器類:

import java.util.concurrent.atomic.AtomicLong; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.RestController; 

@RestController 
public class Controller { 

private static final String template = "Hello, %s!"; 
private final AtomicLong counter = new AtomicLong(); 

@RequestMapping("/greeting") 
public Greeting greeting(@RequestParam(value ="name", defaultValue="World") String name) { 
    return new Greeting(counter.incrementAndGet(), 
      String.format(template, name)); 

} 

@RequestMapping("/name") 
public Name name(@RequestParam(value="reverse") String name){ 
    Name myName = new Name(name); 
    myName.ReverseName(); 
    return myName; 

} 
/** 
// Other Option 
@RequestMapping("/name") 
public Name name(@RequestParam(value="reverse") String name){ 
    return Name.ReverseName(new Name(name)); 

} 


} 
/** 



} 
+0

第二種方法在我看來更具可讀性,因爲使用了關鍵字「this」。 – akinfermo

+0

對SO徵求意見總是有風險的,但我更喜歡選項2,因爲您調用了必須更改的實例的修改,而不是將其作爲參數傳遞。你有沒有想過創建一個靜態的'reverse'方法來接受一個String並將其返回。然後你已經創建了一個可以用來反轉任何字符串的方法,不僅是'Name's。該方法可以用作Name中的實現。 – Kwebble

回答

2

它們在功能上是不同的。一個修改對象的內部狀態,另一個不修改。
第一個選項不是面向對象,而是功能性的。第二個修改對象的內部狀態,並且是更多的OOP。

哪一個更好取決於您的要求。面向對象只是處理一類問題的一種方法,功能可能會很好。