【공정 실천】 서버 데이터 분석

5733 단어
본고는 왕이운 지역사회에서 온 것이다
저자: 손건순
클라이언트 개발 과정에서 중요한 내용 중 하나는 서버 데이터를 분석하는 것이다. 이 화제에 대해 사람들이 먼저 생각할 수 있는 문제는 어느 json 분석 라이브러리를 사용하는가이다.네, 현재 json 형식을 통해 데이터 전송을 하는 것이 주류입니다. 확실히 다른 json 분석 라이브러리는 성능에 있어서도 약간의 차이가 있습니다.상기 문제도 중요하지만 개발 과정에서 자주 만나는 것은 성능과 관련된 문제가 아니다. 본고는 데이터 사용의 측면에서 여러분에게 경험을 공유하고자 한다.
  • 데이터 구성원은private로 설정하고 기본적으로 set 방법을 제공하지 않습니다

  • 해석된 데이터는 제품에서 수정될 확률이 매우 낮고 데이터의 수정은 버그를 일으키기 쉽다.또한 데이터 대상을 해석하는 과정에서 반사를 통해 대상을 직접 구축하는 경우가 많다. 상기 두 가지 사고를 바탕으로 우리는 데이터에 대한 수정은 폐쇄 원칙, 즉 기본적으로 set 방법을 제공하지 않고 극소수의 경우만 데이터에 대한 수정을 허용하는 것을 제창한다.
  • 우호적인 데이터 접근 인터페이스를 제공합니다

  • 데이터를 읽을 때 흔히 구체적인 장면 사용의 목적을 가지고 온다. 가장 원시적인 데이터는 직접적으로 사용을 만족시키지 못하고 간단한 처리를 해야 한다.따라서 get 방법을 통해 더욱 우호적인 데이터 획득 방식을 제공합니다.get 방법에서 가장 원시적인 데이터를 되돌려주는 것이 아니라 간단한 처리나 데이터의 조합을 중첩합니다.예:
    public class LearnInfo {    //  
        private int learnStatus;    //  
        public boolean isLearned() {        return learnStatus == 2;
        }
    }public class Example {    private void doSomething1(LearnInfo learnInfo) {        //  
            if (learnInfo.getLearnStatus() == 2) {            // dosomething
            }
        }    private void doSomething2(LearnInfo learnInfo) {        //  
            if (learnInfo.isLearned()) {            // do something
            }
        }
    }
  • json 문자열과 코드 호출 사이의 결합을 격리합니다

  • 데이터 분석 라이브러리는 종종 반사를 통해 구성원 필드를 호출하여 구성원 변수의 이름과 json 문자에 엄격한 대응 관계를 가지게 하고 get 방법을 통해 이러한 강한 결합 의존을 차단할 수 있다.예: 버전 1.0
    public class Course {    private description;    public String getDescription() {        if (description == null) {            return "";
            }        return description;
        }
    }public class Example {    private void doSomething(Course course) {
            mTextView.setText(course.getDescription());
        }
    }

    버전 1.1, 일부 이유로 버전 교체 과정에서 백엔드 필드가 변경될 수 있음
    public class Course {    //  
        private desc;    //  
        public String getDescription() {        if (desc == null) {            return "";
            }        return desc;
        }
    }public class Example {    //  
        private void doSomething(Course course) {
            mTextView.setText(course.getDescription());
        }
    }
  • 디버깅과 로그

  • Android Studio에서 구성원 변수에 대해 Field Watchpoint를 통해 인터럽트 디버깅을 할 수 있으며, get 방법을 도입한 후 일반적인 인터럽트 디버깅 방식을 추가했습니다.필요한 경우 get 방법에 로그를 추가할 수 있습니다.
  • 데이터 합법성 검사 메커니즘을 도입한다

  • 일단 불법 데이터가 시스템에 들어간 후에 많은 이상한 상황을 가져올 수 있다. 코드 설계를 할 때 이상 논리적 지점 처리가 충분하지 않으면 시스템 이상, 심지어 응용 프로그램 붕괴를 초래하기 쉽다.따라서 가능한 한 원천에서 이상 데이터의 진입을 막고 빨리 처리할수록 후기에 미치는 영향이 적다는 것을 권장한다.일반적으로 서버에서 데이터를 얻는 것은 이를 시스템에서 진정으로 의미가 있는 대상으로 해석할 때 데이터의 합법성을 검사하는 첫 번째 시간으로 보는 것이 비교적 적절하다.흔히 볼 수 있는 불법 데이터.
  • 비어 있는 필드가 비어 있는 값을 반환할 수 없습니다

  • 자바 언어는 빈 바늘에 대한 처리가 우호적이지 않습니다. Null Pointer Exception은 붕괴의 주요 원인 중 하나입니다.시스템 교체 과정에서 데이터 구조에서 이 반환값이 빈값으로 되돌아오는 경우가 자주 발생한다.이 문제에 대해 여러 가지 해결 방안이 있는데 하나는 시스템 전체의 이상 포착을 하는 것이다. 이런 방법은 간단하고 난폭하며 근원적으로 문제를 해결하지 않고 우아하지 못하다.또 다른 방법은 데이터에 사용된 곳에 모두 판공을 덧붙이는데 이런 방법은 번거롭고 누락되기 쉬워 개발자들이 비교적 고통스럽다.필자는 프로젝트 개발 과정에서 틀 차원에서 이 문제를 해결하는 기술 방안을 시도했다.Nullable와 NotNull 메모에 대한 지원을 도입하여 필드를 정의할 때 메모를 통해 필드 값이 메모 설명에 맞는지 확인합니다.주해 방식은 일반적으로 백엔드와 약속된 빈 값을 해결하는 데 적합하다.사실상 더 좋은 사용자 체험을 만족시키기 위해 더 많은 필드는 디자인할 때 빈 값을 허용하는 경향이 있다.따라서 빈 값이 들어갈 수 있는 상황에서 get 방법을 설계할 때 빈 값을 되돌릴 수 없고 2층 보호를 요구합니다.예:
    public class Course {    @NotNull
        private long id; // id  
    
        private List units; //  
        private String description; //  
    
        //  null , 
        public List getUnits() {        if (units == null) {            return new ArrayList();
            }        return units;
        }    //  null , 
        public String getDescription() {        if (description == null) {            return "";
            }        return description;
        }
    }
  • 되돌아오는 데이터는 논리에 부합되지 않는다

  • 경우에 따라 해석된 데이터는 다음과 같은 논리에 맞지 않습니다.
    public class PageInfo {
        private totalCount;    private currentPage;
    }totalCount : 0, currentPage : 11

    서버의 이상 처리가 부적절하기 때문에 클라이언트는 totalCount가 0이고currentPage가 11로 해석되어 논리에 맞지 않습니다.이 데이터를 계속 아래로 전달하면 수조가 경계를 넘는 이상을 일으켜 프로그램이 붕괴될 가능성이 높다.따라서 LegalModel 인터페이스를 정의하는 3층 보호 메커니즘도 도입했습니다. 코드는 다음과 같습니다.
    public interface LegalModel {    boolean check();
    }public class PageInfo implements LeagalModel {    private totalCount;    private currentPage;    @Override
        public boolean check() {        return totalCount > currentPage;
        }
    }public class Example {    private void doSomething(PageInfo pageInfo) {        if (!pageinfo.check()) {            //  
            }
        }
    }
  • 혼동에 관하여

  • json 분석 라이브러리가 반사를 통해 데이터 대상을 구축할 때 데이터 대상 클래스는 혼동에 참여할 수 없습니다. 그렇지 않으면 대응하는 필드 이름을 찾을 수 없습니다.혼동을 피하는 일반적인 방법은 데이터 모델 클래스를 같은 패키지 이름 아래에 집중적으로 놓고 혼동 설정에서 설정 경로를 통해 혼동을 피하는 것이다.이런 방식은 비교적 뚜렷한 한계가 있다. 즉, 파일이 경로를 바꾸면 설정 파일에 해당하는 경로를 추가해야 한다.이런 제한은 개발자의 조작 과정에서 매우 우호적이지 않고 비교적 번거로우며 특히 누락되기 쉽다.따라서 혼동을 피하기 위해 빈 인터페이스를 통해 문제를 해결하는 것을 추천한다.코드는 다음과 같습니다.
    //  public interface NoProguard {
    
    }//  public class Course implements NoProguard {    private String description;    //  
        public static class LearnInfo implements NoProguard {        private int learnStatus;    
        }
    }//  -keep interface com.example.NoProguard {*;}
    -keep class * implements com.example.NoProguard {*;}
  • 포장류 대신 기본 유형을 사용하는 것을 권장합니다

  • 포장류의 기본값은null로 빈 바늘 이상을 일으키기 쉽습니다.기본 형식은 기본값을 가지고 대량의 판공 코드를 절약했다.int와 Integer를 예로 들면 어떤 경우 int 기본값 0에 대해 일정한 의미를 가진다. 이런 장면의 확률이 높지 않기 때문에 일반적으로 약정할 때 0값을 사용하여 간단하게 회피하는 것을 피할 수 있다.
    왕이운 무료 체험관, 0 원가 체험 20+형 클라우드 제품!
    더 많은 네트워크 연구 개발, 제품, 운영 경험을 공유하려면 네트워크 클라우드 커뮤니티를 방문하십시오.
    관련 글: [추천] Redis+Kafka 기반 첫 페이지 노출 필터링 방안 [추천] 메시지 전송 플랫폼 고가용 실천 (상)[추천] 안드로이드에서 FlatBuffers 사용하기 (아래)

    좋은 웹페이지 즐겨찾기