2014-01-05 5 views
5

에필로에서 변경할 수없는 POINT 클래스를 만들려고합니다. 아래의 코드가 하나의 코드를 정의합니까? xy 필드의 {NONE} 접근 용이성이면 충분합니까? x = x'과 같은 클래스 불변량에 무언가를 쓸 수 있습니까? 그렇지 않으면 어떻게 불변성을 얻을 수 있습니까?에펠의 변경 불가능한 클래스

class POINT 
    create 
     make 
    feature {NONE} 
     x: DOUBLE 
     y: DOUBLE 
    feature 
     make (x_: DOUBLE; y_: DOUBLE) 
     do 
      x := x_ 
      y := y_ 
     ensure 
      set: x = x_ and y = y_ 
     end 

    feature --accessors 
     get_x: DOUBLE 
     do 
      Result := x 
     ensure 
      Result = x 
     end 
    end 
+2

메모를 에펠 스타일 가이드 접근 자에 따르면, 따라서 접두사를 얻을 명사입니다. 코드를 읽기 쉽게 만듭니다 (거의 모든 언어에 해당). 그러나 속성을 자신의 접근자가 아래에 표시 할 때 접두사를 가져 오지 않습니다. –

답변

5

에펠은 클라이언트의 클래스 속성을 변경할 수 없습니다. 예를 들어 다음 코드는 거부됩니다.

p: POINT 
... 
p.x := 5.0 

결과적으로 다른 언어와 마찬가지로 getter를 제공 할 필요가 없습니다. p.x을 사용하면 x을 클라이언트 클래스로 충분히 내보낼 수 있습니다. 따라서, 귀하의 예제의 코드는 그렇지 않은 경우 (즉, 비 생성) 루틴에 정상적인로를 이용하고, 생성 절차는 더 이상 수출 하지 것을

class POINT 
create 
    make 
feature -- Access 
    x: DOUBLE 
    y: DOUBLE 
feature {NONE} -- Creation 
    make (x0: DOUBLE; y0: DOUBLE) 
     -- Initialize object with `x0' and `y0'. 
    do 
     x := x0 
     y := y0 
    ensure 
     set: x = x0 and y = y0 
    end 
end 

참고로 단순화 될 수있다 속성을 변경, 그

create p.make (1, 1) 
p.make (2, 3) 
print (p) 

을 다음과 원래 객체 p의 값을 변경 할 수있을 것입니다 즉이 그것을 변경할 수있어, (2, 3)를 인쇄하는 것처럼 우리가 뭔가를 할 수있을 것입니다.

이제 특성을 직접 변경할 수는 없지만 기능을 POINT 유형의 개체에서 호출하고 전체 개체를 변경할 수 있습니다. 여러분이이 상황을 방지하려면 기능은 예외를 발생하는 클래스 POINT에서 다시 정의 할 수 있습니다, 심지어 사후 False 당신을 위해 예외를 발생하는 런타임을 유발 가지고 :

copy (other: like Current) 
     -- <Precursor> 
    do 
     (create {EXCEPTIONS}).raise ("Attempt to change an immutable object.") 
    ensure then 
     is_allowed: False 
    end 
+1

"p.x : = 5.0"을 사용하려면 할당자를 사용할 수 있습니다. 참조 : http://docs.eiffel.com/book/examples/example-self-initializing-attributes-and-assigner-commands. –

+0

나는 그것을 얻지 못한다. 내가 make를 private로 설정하면 어떻게 될까? 내가 전화하면 지금 : create p1.make (1, 1); 인쇄 (p1); \t p1.make (2, 3); print (p1) 결과를 얻는 것보다 : (1, 1) (2, 3) 그리고 가시성이 설정되지 않았을 때 같은 일이 발생하고 –

+0

그리고이 클래스를 상속하면, make 기능을 재정의 할 수는 있지만 {NONE}은 하위 클래스조차도 기능을 변경할 수 없다고 말합니다. 또는 create 메소드에는 그것에 대해 다른 규칙이 있습니까? –

관련 문제