복붙노트

[SCALA] 왜 정적 방법은 좋은 OO 연습 간주됩니다? [닫은]

SCALA

왜 정적 방법은 좋은 OO 연습 간주됩니다? [닫은]

내가 스칼라 프로그래밍 읽고 있어요. 제 4 장 시작되는 시점에, 저자의 의견 자바는 정적 메소드, 지원 "그리 순수 OO 개념을." 왜 이렇게입니까?

해결법

  1. ==============================

    1.정적 메소드 지금까지 언급되지 않은 매우 OO 아니라는 것을 한 가지 이유는 인터페이스와 추상 클래스는 비 정적 방법을 정의하는 것입니다. 정적 메소드 따라서 상속에 잘 맞지 않습니다.

    정적 메소드 지금까지 언급되지 않은 매우 OO 아니라는 것을 한 가지 이유는 인터페이스와 추상 클래스는 비 정적 방법을 정의하는 것입니다. 정적 메소드 따라서 상속에 잘 맞지 않습니다.

    정적 메서드는 정적 메서드가 어떤 진정한 의미에서 재정의 할 수 없다는 것을 의미한다 "슈퍼"에 대한 액세스 권한이없는도 있습니다. 사실, 그들은 모두에서 재정의 할 수 없습니다 만 숨겨진. 이 시도:

    public class Test {
        public static int returnValue() {
            return 0;
        }
    
        public static void main(String[] arg) {
            System.out.println(Test.returnValue());
            System.out.println(Test2.returnValue());
            Test x = new Test2();
            System.out.println(x.returnValue());
        }
    }
    
    
    public class Test2 extends Test {
        public static int returnValue() {
            return 1;
        }
    }
    

    당신이 이것을 실행하면, 당신은 당신이 무엇을 기대하지 않습니다. Test.returnValue ()는 당신이 기대하는 것을 제공합니다. Test2.returnValue ()는 슈퍼 클래스에서 같은 이름의 방법을 (그것을 무시하지 않습니다) 숨 깁니다, 그리고 당신이 무엇을 기대 제공합니다.

    하나는 순진 사용 다형성에 대한 정적 메소드를 호출하는 "비 정적"기대할 수 있습니다. 그것은하지 않습니다. 무엇이든 클래스 변수는 메소드를 검색하는 데 사용되는 하나 같이 선언됩니다. 누군가가 코드가 실제로 무엇을에서 뭔가 다른 할 기대할 수 있기 때문에 나쁜 형태입니다.

    이것은 "음주 정적 메서드를 사용하지!"하지 의미 하는가 그것은 당신이뿐 아니라 싱글을 만드는 게으른 방법으로, 당신이 정말로 Class 객체 메소드를 소유하려면 해당 인스턴스에 대한 정적 메소드의 사용을 예약해야한다는 것을 의미한다.

  2. ==============================

    2.객체 지향은 세 가지에 관한 것입니다 :

    객체 지향은 세 가지에 관한 것입니다 :

    이 세 가지 중 가장 중요한 하나는 메시징된다.

    정적 방법은 적어도 메시징 및 후기 바인딩에 위반.

    OO에서 계산 서로 메시지를 보낼 독립형 네트워크 개체에 의해 수행된다는 것을 의미 메시징의 개념. 메시지를 전송하는 통신 / 연산하는 유일한 방법이다.

    정적 메서드는하지 않습니다. 그들은 모든 개체와 연관되지 않습니다. 그들은 정말 일반적인 정의에 따라, 전혀 방법이 아니다. 그들은 정말 그냥 절차입니다. 자바 정적 방법 Foo.bar과 BASIC 서브 루틴 FOO_BAR 사이에 차이가 거의 없습니다.

    에 관해서는 후기 바인딩 : 그것에 대해 좀 더 현대적인 이름은 동적 파견이다. 정적 방법도 사실, 그것은 그들의 매우 이름도있어, 그 위반 : 정적 메서드를.

    정적 메소드는 객체 지향의 매우 좋은 특성을 휴식. 예를 들어, 객체 지향 시스템은 자동 기능 안전 객체 기능 역할에 있습니다. 정적 메서드는 속성을 중단 (또는 정말 어떤 정적, 정적 상태 또는 정적 방법일지도).

    그들은 단지 따라서 일부 사소한 동시성을 제공하는 메시징을 통해 통신하기 때문에 당신은 또한, 자체 프로세스에서 병렬로 모든 개체를 실행할 수 있습니다. (칼 휴이트는 스몰 토크-71, 그리고 앨런 케이 (Alan Kay)에 따라 액터 모델을 생성하기 때문에, 너무 놀라운 일이 안 기본적으로 배우, 마찬가지로 부분적으로 다시 칼 휴이트가 만든 PLANNER를 기반으로 스몰 토크-71를 만들었습니다. 닫기를 배우와 객체 사이의 관계는 실제로 그들은 본질적으로 하나와 동일하다.) 또, 정적 (정적 방법, 좋은 특성이 특히 정적 상태) 휴식까지 우연에서이다.

  3. ==============================

    3."나쁜 연습"과 "그리 순수 OO 개념"을 혼동하지 마십시오. "순수 OO"가된다는 것은 당신이 달성하려고 시도해야한다는 일부 만병 통치약이 아니다. 정적 메서드는 인스턴스 변수를 고려하지 않는다해서 매개 변수는 유용하지 않은 것을 의미하지 않기 때문에. 어떤 것들은 단지 객체 자신을 빌려하지 않으며, 그들은 단지 "순결"을 위해 그 틀을 강요해서는 안된다.

    "나쁜 연습"과 "그리 순수 OO 개념"을 혼동하지 마십시오. "순수 OO"가된다는 것은 당신이 달성하려고 시도해야한다는 일부 만병 통치약이 아니다. 정적 메서드는 인스턴스 변수를 고려하지 않는다해서 매개 변수는 유용하지 않은 것을 의미하지 않기 때문에. 어떤 것들은 단지 객체 자신을 빌려하지 않으며, 그들은 단지 "순결"을 위해 그 틀을 강요해서는 안된다.

    어떤 사람들은 그 일이 "순수"해야한다고 생각, 그래서 아무것도 "불순한는"나쁜 방법입니다. 실제로, 나쁜 관행은 혼란 것들, 유지하기 어려운 사용하기 어려운 등 인스턴스를 받아 처리하는 방법은 아마도 인스턴스 메서드해야하기 때문에 인스턴스 나쁜 관행이 걸릴 정적 메서드 만들기를하고있다. 그들은 정적이어야한다, 그래서 다른 한편으로는, 유틸리티 및 공장 기능 같은 것들을 일반적으로, 인스턴스를하지 않습니다.

    그들은 "순수한 OO"하지 않은 이유를 궁금해하는 경우가 인스턴스 메소드가 없습니다 때문입니다. A "순수"OO 언어는 모든 오브젝트되는 모든 기능 인스턴스 방법이 될 것이다. 물론, 그것은 정말 모든 시간을 유용하지 않습니다. 예를 들어, Math.atan2 방법을 고려한다. 이 두 숫자를 취하고있는 상태를 필요로하지 않습니다. 당신은 그것의 방법은 무엇 오브젝트 할 수 있을까? 는 "순수"OO 언어에서, 수학은 그 자체가 객체 (싱글, 아마)를 야기 할 수 있으며 ATAN2는 인스턴스 방법이 될 것입니다,하지만 기능은 실제로 Math 객체의 모든 상태를 사용하지 않기 때문에, 그것도 아니다 "순수 OO"개념.

  4. ==============================

    4.정적 메서드는 디자인 지향 좋은 개체의 위반 꽉 커플 링을 야기한다. 정적 메소드는 본질적으로 같은 상속 및 다형성과 같은 객체 지향 설계 기술을 지원하지 않기 때문에 호출 코드와 정적 메소드 내 코드의 긴밀한 결합은 종속성 반전을 통해 피할 수 없습니다.

    정적 메서드는 디자인 지향 좋은 개체의 위반 꽉 커플 링을 야기한다. 정적 메소드는 본질적으로 같은 상속 및 다형성과 같은 객체 지향 설계 기술을 지원하지 않기 때문에 호출 코드와 정적 메소드 내 코드의 긴밀한 결합은 종속성 반전을 통해 피할 수 없습니다.

    정적 메서드 외에도 자주 코드에 따라 달라 타사 인프라로 이어질 때문에이 밀접하게 결합 종속성 시험에 어려운 - 데이타베이스처럼, 그것은 매우 어려운 사실에 이동하고 변경하지 않고 동작을 변경할 수 있습니다 암호.

  5. ==============================

    5.정적 메서드는 이유로 인해 아래 좋은 OO 연습 간주되지 않습니다 :

    정적 메서드는 이유로 인해 아래 좋은 OO 연습 간주되지 않습니다 :

    1) 재 사용성을 방지 :

    정적 메소드는 오버라이드 (override) 할 수 없습니다. 이 인터페이스에 사용할 수 없습니다.

    2) 개체 수명이 매우 길다 :

    정적 메소드는 로그 시간 동안 메모리에 유지 및 가비지 수집은 시간이 오래 걸린다. 개발자의이 파괴 또는 정적 변수의 생성에 대한 제어가 없습니다. 정적 변수의 과도한 사용은 메모리 오버 플로우가 발생할 수 있습니다.

    3) 또한, 다른 점 :

    객체 does't는 국가의 완전한 통제에 남아 있기 때문에 캡슐화를 존중하지 않습니다. 등이 제어 반전 느슨한 결합 의존성 주입 같은 개념을 따르지 않는다

  6. ==============================

    6.실제로 그들과 연관되는 객체없이 호출 될 수 있기 때문에 정적 방법은 순수한 OO 개념이 아니다. 당신은 클래스 자체를 사용합니다. 당신은 (...)이 Classname.method처럼 그들을 호출;

    실제로 그들과 연관되는 객체없이 호출 될 수 있기 때문에 정적 방법은 순수한 OO 개념이 아니다. 당신은 클래스 자체를 사용합니다. 당신은 (...)이 Classname.method처럼 그들을 호출;

  7. ==============================

    7.OO의 개념은 객체 데이터에 액세스 / 제어하는 ​​방법에 대한 이야기이지만, 정적 메소드는 객체를 사용하여 호출 할 필요가 없습니다 그리고 그들은 클래스가 아닌 객체에 속한다.

    OO의 개념은 객체 데이터에 액세스 / 제어하는 ​​방법에 대한 이야기이지만, 정적 메소드는 객체를 사용하여 호출 할 필요가 없습니다 그리고 그들은 클래스가 아닌 객체에 속한다.

    --건배

  8. from https://stackoverflow.com/questions/4002201/why-arent-static-methods-considered-good-oo-practice by cc-by-sa and MIT license