2016-12-08 7 views
2

나는 오픈 소스 프로젝트 - 객체 문서 매퍼 일명으로 일한다. ODMjavascript에두고 디자인 결정에 직면하고 있습니다 (다소 simple이 아니라 easy).응용 프로그램 논리에 의해 처리되기 전에 복제 된 입력 데이터 객체 여야합니까?

ODM에서 데이터베이스의 데이터 문서를 설명하는 Model 개체를 정의 할 수 있습니다. 새 Model 인스턴스 객체를 만들 때 인수를 통해 데이터 값을 전달할 수 있습니다.
의사 코드는 :

var data = { 
    username: 'james' 
    email: '[email protected]', 
    country: { 
     code: 'US', 
     city: '' 
    } 
}; 
// In case the data object would not be cloned, it would be mutated by the ODM 
var user = new UserModel(data); 

지금, 내가 직면하고있어 결정은이 응용 프로그램 (ODM)에 의해 처리되기 전에 자동으로 모델에 data 개체를 복제 할 것인지 여부입니다. 입력 데이터를 복제하지 않도록 선택합니다. javascript 커뮤니티에서는 최종 사용자를 위해 easy (simple이 아님)을 만들 수 있기 때문에 일반적으로 데이터를 복제하는 것이 일반적입니다. 내 연구 결과에 따르면 유사하고 인기있는 프로젝트가 데이터를 복제하기로 한 결정을 내렸지 만 모델이 복잡한 데이터 스키마 &을 가질 수 있다는 점을 고려할 때 이것이 올바른 선택인지 확신 할 수 없으며 어떤 차이도 발생하지 않습니다. 예를 들어 수십 개의 Model 인스턴스 객체의 경우, 다음과 같이 작업하는 동안 문제가 될 수 있다고 생각합니다. : Model 개 개체.

나는 주제에 대한 당신의 추론을 듣고 싶습니다. 그리고 당신의 선택은 무엇입니까?
이미 다른 답변이 표시되는 경우 언제든지 주저없이 생각을 적어주세요.
감사합니다.

var UserModel = function(data) { 
 
    this.data = data; 
 
} 
 
UserModel.prototype.getUsername = function() { 
 
    return this.data.username; 
 
} 
 

 
var data = {username: 'james'}; 
 
var james = new UserModel(data); 
 

 
data.username = 'john'; 
 
var john = new UserModel(data); 
 

 
console.log(james.getUsername()); // "john" 
 
console.log(john.getUsername()); // "john"

이 될 수 있습니다 : 당신이 엔티티의 데이터를 보유하기 위해 입력 개체를 계속 사용하는 경우 개체를 복제하지 않는 경우

답변

0

, 당신은 다음과 같은 문제에 직면하게 될 것이다 항상 분명하지는 않은 일부 불쾌한 버그에 이르기까지.


대신 복제, 제 생각에 가장 깨끗한 방법 대신 객체에서 관련 정보를 추출하고 직접 멤버 속성으로 유지하는 것입니다 : 더 나은

var UserModel = function(data) { 
    this.username = data.username; 
    this.email = data.email; 
} 
UserModel.prototype.getUsername = function() { 
    return this.username; 
} 
UserModel.prototype.getEmail = function() { 
    return this.email; 
} 

, 명시 적으로 선언 속성을 생성자의 인수로 사용하십시오.

var UserModel = function(username, email) { 
    this.username = username; 
    this.email = email; 
} 
+0

@ Timo.In 귀하의 제안 된 설계 접근 방식에 대해 감사드립니다. 속성은 데이터 프리미티브가 아니라 중첩 된 객체/배열입니다. 너무 간단한 코드 예제를 제공함으로써 내 실수라고 생각합니다. 당신이 설명한 문제에 대해 - 내가 이해하고 싶은 것은 왜 다른 모델로 전달되기 전에 먼저 복제하지 않고 그 방법으로 Object를 사용하는 것을 고려해야한다는 것입니다. Objects/Arrays를 기본적으로 메모리에 대한 참조로 취급하지 않아야합니까? 그것이 원시적 인 것과 같은 방식으로 처리된다고 가정 할 때? – user2694295

+1

프리미티브뿐만 아니라 자식 개체를 별도의 엔터티로 구조화하지 않으면 동일한 원칙이 적용되고 복사가 필요할 수 있습니다. 완벽한 세계에서 첫 번째 예가 결코 일어나지 않을 것입니다. 그러나 일반적으로 총을 발에서 쏘거나 나중에 더 잘 알려야한다고 말하기보다는 API 사용자에게서 총을 빼는 것이 좋습니다.API를 사용하는 사용자는 구현 세부 정보에 대해 알 필요가 없으며 반드시 수행해야합니다. 더 많은 가정을 할수록 설계중인 API를 사용하는 것이 어려워집니다. – Timo