내 길고 늦은 대답은 완전하지는 않지만 좋은 설명입니다. 왜 내가이 패턴, 의견 및 일부 감정을 싫어하는지 :
1) 짧은 버전 : Active Record 는 데이터베이스와 애플리케이션 코드 사이 에 " 강력한 바인딩 " 의 " 박층 "을 만듭니다 . 논리적, 문제, 문제를 전혀 해결하지 않습니다. IMHO 는 프로그래머를위한 일부 구문 설탕 을 제외하고는 어떤 값도 제공하지 않습니다 (그런 다음 "객체 구문"을 사용하여 관계형 데이터베이스에 존재하는 일부 데이터에 액세스 할 수 있음). 프로그래머를위한 약간의 편안함을 만들기위한 노력은 (IMHO ...) 낮은 수준의 데이터베이스 액세스 도구에 더 잘 투자되어야합니다. 예를 들어 단순하고 쉬우 며 평범 하고 유사한 방법 의 일부 변형 (물론 개념과 우아함은 사용 된 언어).hash_map get_record( string id_value, string table_name, string id_column_name="id" )
2) 긴 버전 : 내가 사물을 "개념적으로 제어"할 수있는 데이터베이스 기반 프로젝트에서 AR을 피했고 좋았습니다. 저는 보통 계층화 된 아키텍처를 구축합니다 (적어도 중대형 프로젝트에서는 조만간 소프트웨어를 계층으로 나눕니다).
A1) 데이터베이스 자체, 테이블, 관계, 심지어 DBMS가 허용하는 경우 일부 논리 (MySQL도 이제 어른이 됨)
A2) 매우 자주, 데이터 저장소 이상의 것이 있습니다. 파일 시스템 (데이터베이스의 Blob이 항상 좋은 결정은 아닙니다 ...), 레거시 시스템 ( "어떻게"액세스 할 것인지 상상해보십시오. 다양한 종류가 가능합니다 .. 요점이 아니라 ...)
B) 데이터베이스 액세스 계층 (이 수준에서 도구 방법, 데이터베이스의 데이터에 쉽게 액세스 할 수있는 도우미는 매우 환영하지만 AR은 일부 구문 설탕을 제외하고 여기에 어떤 가치도 제공하지 않습니다)
C) 애플리케이션 객체 레이어 : "애플리케이션 객체"는 때때로 데이터베이스에있는 테이블의 단순한 행이지만 대부분은 어쨌든 복합 객체이고 더 높은 로직이 연결되어 있으므로이 수준에서 AR 객체에 시간을 투자하는 것은 분명히 쓸모가 없습니다. , 귀중한 코더의 시간 낭비입니다. 왜냐하면 "실제 가치", 이러한 객체의 "높은 논리"가 AR 객체 위에 구현되어야하기 때문입니다. AR의 유무에 관계없이! 예를 들어 "로그 항목 개체"를 추상화하려는 이유는 무엇입니까? 앱 로직 코드가이를 작성하지만 업데이트하거나 삭제할 수 있어야합니까? 어리석게 들리며 App::Log("I am a log message")
사용하기 더 쉬운le=new LogEntry(); le.time=now(); le.text="I am a log message"; le.Insert();
. 예를 들어, 애플리케이션의 로그보기에서 "로그 항목 개체"를 사용하면 100, 1000 또는 10000 개의 로그 행에서 작동하지만 조만간 최적화해야합니다. 대부분의 경우에는 많은 코드를 감싸고 숨기는 단단한 고정 AR 아이디어 프레임에 작은 문을 래핑하는 대신 앱 로직에서 작고 아름다운 SQL SELECT 문을 사용하십시오 (AR 아이디어를 완전히 깨뜨립니다 ..). AR 코드 작성 및 / 또는 작성에 낭비 된 시간은 로그 항목 목록을 읽기위한 훨씬 더 영리한 인터페이스에 투자되었을 수 있습니다 (다양한 방법으로 하늘이 한계입니다). 코더는 의도 한 애플리케이션에 맞는 애플리케이션 로직을 실현하기 위해 새로운 추상화를 발명 해야하며 어리석은 패턴을 어리석게 다시 구현하지 않아야합니다., 첫눈에 좋은 소리!
D) 응용 프로그램 논리-상호 작용하는 객체의 논리를 구현하고 응용 프로그램 논리 객체를 생성, 삭제 및 나열 (!)합니다 (아니요, 이러한 작업은 응용 프로그램 논리 객체 자체에 거의 고정되어서는 안됩니다. 책상 위의 종이가 말합니까? 사무실에있는 다른 모든 시트의 이름과 위치를 알고 계십니까? 객체를 나열하는 "정적"방법을 잊어 버리십시오. 인간의 사고 방식을 [일부 AR 프레임 워크와 유사하지 않은 -] AR 사고)
E) 사용자 인터페이스-글쎄요, 다음 줄에 쓸 내용은 매우 주관적이지만 제 경험상 AR을 기반으로 구축 된 프로젝트는 애플리케이션의 UI 부분을 무시하는 경우가 많았습니다. 모호한 추상화를 만드는 데 시간이 낭비되었습니다. . 결국 이러한 응용 프로그램은 많은 코더의 시간을 낭비하고 내부 및 외부 기술에 관심이있는 코더 용 코더의 응용 프로그램처럼 느껴집니다. 코더는 기분이 좋아지고 (종이의 개념에 따라 모든 것이 끝났고 정확 해졌습니다.) 고객은 "프로페셔널"이기 때문에 "그렇게해야한다는 것을 배워야합니다".. 좋아, 미안하다, 나는 빗나 갔다 ;-)
음,이 모든 것은 주관적이지만 제 경험입니다 (Ruby on Rails 제외, 다를 수 있으며 해당 접근 방식에 대한 실제 경험이 없습니다).
유료 프로젝트에서 나는 종종 더 높은 수준의 애플리케이션 로직을위한 빌딩 블록으로 "활성 레코드"개체를 만드는 것으로 시작하라는 요구를 들었습니다. 내 경험상 이것은 눈에 띄게 자주고객 (대부분의 경우 소프트웨어 개발 회사)이 최종적으로 제품이되어야 할 제품에 대한 좋은 개념, 큰 견해, 개요를 가지고 있지 않은 것에 대한 일종의 변명이었습니다. 이러한 고객은 견고한 프레임 ( "10 년 전 프로젝트에서는 잘 작동했습니다 ..")으로 생각하고 엔티티를 구체화하고 엔티티 관계를 정의하고 데이터 관계를 분해하고 기본 애플리케이션 로직을 정의 할 수 있지만 그런 다음 중지합니다. 그리고 그것을 당신에게 넘겨주고, 당신이 필요로하는 전부라고 생각합니다 ... 그들은 종종 애플리케이션 로직, 사용자 인터페이스, 유용성 등의 완전한 개념이 부족합니다 ... 그들은 큰 시야가 부족하고 그들은 AR 방식을 따르기를 원합니다. 왜냐하면 .. 음, 왜 몇 년 전에 그 프로젝트에서 효과가 있었는데 사람들을 바쁘고 조용하게 유지하기 때문입니까? 모르겠어요. 그러나 "세부 사항" 남자들과 남자들을 분리하거나 .. 원래의 광고 슬로건은 어땠나요? ;-)
수년 (10 년의 활발한 개발 경험) 후 고객이 "활성 레코드 패턴"을 언급 할 때마다 알람 벨이 울립니다. 나는 그들을 본질적인 개념 단계로 되돌리려 고 노력하고, 두 번 생각하게하고, 그들의 개념적 약점을 보여 주도록 시도하거나, 그들이 무분별하다면 아예 피하는 법을 배웠습니다. 원하는 것이 무엇인지 알고, 알지만 모른다고 생각하거나 무료로 개념 작업을 ME에 외부화하려고 시도하면 많은 귀중한 시간, 며칠, 몇 주 및 몇 달이 소요되며 라이브가 너무 짧습니다 ...).
그래서 마지막으로,이 모든 것이 내가 그 어리석은 "액티브 레코드 패턴"을 싫어하는 이유이며, 가능할 때마다이를 피할 것입니다.
편집 : 나는 이것을 No-Pattern이라고 부를 것입니다. 문제를 해결하지 못합니다 (패턴은 구문 설탕을 생성하기위한 것이 아닙니다). 그것은 많은 문제를 일으킨다. (여기에 많은 답변에서 언급 된) 모든 문제의 근원은 패턴 정의에 의해 극도로 제한된 인터페이스 뒤에 좋은 오래된 잘 개발되고 강력한 SQL을 숨기는 것입니다.
이 패턴은 유연성을 구문 적 설탕으로 대체합니다!
AR이 어떤 문제를 해결해 줄까요?