게 으 름 모드

4323 단어
"게 으 르 고 오만 하 며 인내심 이 부족 한 것 은 프로그래머 의 3 대 미덕" - Larry Wall (Perl 's father)
옛날 에 는 '홍 보 서' 와 같은 책 이 었 습 니 다. 면접 에서 '모델' 에 대해 이야기 하면 가산 점 이 있 었 습 니 다. 동료 들 은 가끔 '아, 여 기 는 singleton 모델 이 고 거 기 는 clone 모델 입 니 다' 라 고 말 했 습 니 다. 오늘 우 리 는 모델 에 대해 잘 이야기 하지 않 고 문 제 를 만 났 을 때 방법 을 정리 해 냈 습 니 다. 어떤 때 는 방법 이 유용 하고 어떤 때 는 방법 이 통 하지 않 아 장애 가 되 었 습 니 다.
저 는 프로그램 디자인 에서 '생각 하고 배우 지 않 으 면 die, 배우 고 생각 하지 않 으 면 money' 는 보편적 인 문제 라 고 생각 합 니 다. 그래서 저 는 좀 더 간단 한 '모델' 을 소개 하려 고 합 니 다. '간단 하지만' 본질 적 인 '사 고 를 일 으 킬 수 있 습 니 다. 이런' 간단 한 '모델 이 당신 이 많이 생각 하 는 데 도움 이 되 기 를 바 랍 니 다.
패턴 의 -- 게 으 름
  • c 언어 는 이러한 문 구 를 허용 합 니 다 my assert = (true | (1 / 0) > millon). 우 리 는 (1 / 0) 발생 하지 않 는 다 는 것 을 알 고 있 습 니 다. 이것 은 단락 값 이 라 고 합 니 다.
  • 세 개의 연산 자, gain = stupid test 와 유사 합 니까? million: (1 / 0);
  • if 가 너무 수 다스 럽 고 세 눈 이 예 쁘 지 않다 고 싫어 합 니 다. 어떤 사람 은 예 쁜 inline 함 수 를 쓰 기 를 원 합 니 다.
      int my_if(test, trueValue, falseValue)
      {
          if(test) trueValue else falseValue;
      }
      //usage
      gain = my_if(stupid_test, 1000000, (1/0) )
    
    그러나 그 는 이렇게 하면 전혀 안 된다 는 것 을 알 게 되 었 습 니 다! (1 / 0) 항상 값 을 구 합 니 다!
  • scala 의 해결 방안,
    def my_if(p: boolean, true_value : =>int, false_value : => int) 
    gain = my_if(stupid_test, 1000000, (1/0) )
    //perfect
    
    설명: = > int 는 함수 형식 이 고 입력 이 비어 있 으 며 int 로 되 돌아 가 는 것 을 나타 낸다.
  • c \ # 방법 int my if (bool p, func trueValue, func falseValue) {if (p) trueValue () else falseValue ()} / / 못 생 겼 지만 my if (true, () = > million, () = > 1 / 0)
  • lazy 모드 는 수요 치 에 따라 필요 할 때 만 계산 할 수 있 습 니 다. 입력 함수 가 lazy 를 실현 하 는 관건 이라는 것 을 알 수 있 습 니 다.
    위 에는 쓸모없는 예 들 이 있 으 니 실제 적 인 예 를 말 해 보 세 요.
  • log 시스템 은 c \ #, 자바 와 같은 코드 에 있 습 니 다. 우 리 는 항상 c 언어 에 존재 하지 않 는 고민 (매크로 가 없 기 때 문) 이 있 습 니 다. 예 를 들 어 내부 순환 에서 log 를 하 는 것 은 매우 조심해 야 할 일 입 니 다. 왜냐하면 우 리 는 항상 이런 형식 으로 쓰 이기 때 문 입 니 다. if (log level > LOG DEBUG) log. e (string. format ("state:% d,% d,% d", getx (), gety (), getz ())))))디 버 깅 스위치 를 열지 않 았 을 때, 여기 에는 if 의 비용 만 발생 합 니 다. if 가 없 으 면 string. format 는 항상 발생 합 니 다. 영향 을 미 치 는 비용 이 발생 하지만, 쓰기 에는 귀 찮 습 니 다. 해결 방법 은 almost no 입 니 다. 추 하지만 효과 적 인 방법 은: void lazy log (debug lv, Func cont) {if (log level > LOG DEBUG) log. w (cont () 입 니 다.}/ / usage, 디 버 깅 을 시작 하기 전에 format 에 lazy log (log level, () = > string. format ("state:% d,% d,% d", getx (), gety (), getz ()) 가 발생 하지 않 습 니 다. (진정한 방법 은 DSL 의 지원 이 필요 합 니 다)
  • 단일 예, static T ins = null, static T getInstance () {if ( ins = = null) ins = new T (), / / return ins 가 처음 발생 합 니 다.} 첫 getInstance 시 인 스 턴 스 를 초기 화 합 니 다. 이것 도 수요 치 에 따라 모듈 이 많은 시스템 을 상상 합 니 다. 시스템 간 에 의존성 이 존재 합 니 다. 예 를 들 어 moduleA 는 moduleB 가 먼저 시작 해 야 합 니 다.
  • 때때로 우 리 는 명시 적 으로 그것 을 호출 한다.
      void system_ini()
      {
        ModuleA.init()
        ModuleB.init()
        ...
      }
    

    이렇게 되면 초기 화 과정 을 명시 적 으로 유지 해 야 합 니 다. 단, 하나의 예 를 사용 하면 getInstance 만 있 으 면 정확 한 초기 화 순서 가 자동 으로 발생 합 니 다!
  • 파생 된 memory 모드 는 값 을 구 할 때 우 리 는 항상 처음으로 값 을 구 한 다음 에 사전 에 저장 합 니 다. (사전 에 계산 하지 않 고) 이것 은 공간 과 시간의 균형 을 이 루 는 기술 입 니 다. int hard calc (int i) {if (cache. find (i) return cache. get (i); / int result; / / / very hard word... cache. add (i, result); return result;}만약 당신 이 게임 아 이 템 관 리 를 한 적 이 있다 면, 이런 모델 은 곳곳에서 볼 수 있 습 니 다.
  • 게 으 름 의 본질은 수요 치 에 따라 대부분의 프로 그래 밍 언어 에서 함수 에 들 어 가 는 매개 변수 로 엄격 한 수 치 를 구 하 는 것 이다. 그러나 모든 언어 가 엄격 한 수 치 를 구 하 는 것 은 아니 지만 다른 언어 도 있다. 예 를 들 어 haskell, 게 으 르 지만 상상력 이 있 으 면 무한 장 자연 배열 을 정의 할 수 있다.
  • from 2 = [2..] \ # 실제 발생 하지 않 습 니 다. foreach 가 값 을 옮 겨 다 닐 때 진정한 값 을 구 합 니 다. 그리고 필 터 를 정의 합 니 다.
  • filter pred \ # 하 나 를 다른 흐름 으로 바 꿉 니 다. foreach 가 여러 번 지나 갈 때 안에 값 이 필요 에 따라 생 성 된 다음 에 우 리 는 이 배열 의 첫 번 째 값 으로 정 제 된 모든 수
  • 를 거 릅 니 다.
  • filte from 2 (/ x - > x / 2 = = 0) 와 마찬가지 로 서열 상의 모든 값 이 즉시 발생 하 는 것 이 아니 라 [3.] 마지막 점 을 반복 합 니 다. 우 리 는 이러한 수열 을 얻 었 습 니 다. [2.] [3.] [5.] [7.]... 낯 이 익 죠? 에 라 토스 테 니 체 법, haskell 의 알고리즘 은 직접적 from 2 = [2.] sieve list = h: (sieve $filter (% h) $t) where h = head list t = tail list first_20_prims = take 20 $ sieve from_2

  • 그래, 내 가 c \ # 로 하나 쓸 게.(주: 이 문 제 는 난이도 가 있 습 니 다. 힌트, IEnumerator 인터페이스 와 같은 iterator 를 실현 합 니 다. 얼마나 짧게 썼 는 지, 얼마나 (이해) lazy 를 증명 합 니 다.
  • 좋은 웹페이지 즐겨찾기