ActiveRecord

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 25. september 2019; checks kræver 3 redigeringer .
ActiveRecord
aktiv rekord
Beskrevet i Design Patterns Ikke

Active record ( AR ) er et applikationsdesignmønster beskrevet af Martin Fowler i Patterns of Enterprise Application Architecture . AR er en populær måde at få adgang til relationelle databasedata i objektorienteret programmering .

Active Record-skemaet er en tilgang til at få adgang til data i en database. Databasetabellen eller visningen er pakket ind i klasser. En objektinstans er således bundet til en enkelt række i tabellen. Efter at objektet er oprettet, tilføjes en ny række til tabellen til lagring. Ethvert indlæst objekt får sin information fra databasen. Når et objekt opdateres, vil den tilsvarende række i tabellen også blive opdateret. Indpakningsklassen implementerer accessormetoder eller egenskaber for hver kolonne i en tabel eller visning.

Dette mønster bruges almindeligvis af objektpersistensværktøjer og i objektrelationsmapping ( ORM ). Typisk vil fremmednøglerelationer blive repræsenteret som en objektinstans af den rigtige type via en egenskab.

Implementeringer af dette mønster overtræder ofte Single Responsibility Principle (SRP) ved at kombinere både repræsentationen og den interne logik af selve objektet, såvel som CRUD-mekanismer i ét objekt , så Active Record kan betragtes som et antimønster [1] . I andre tilfælde kan denne erklæring diskuteres, da selve objektet, som implementerer ActiveRecord, ikke indeholder nogen forretningslogik, men giver en tabel fra databasen, har kun én grund til at ændre (ændre tabellen), som ikke modsiger definition af SRP-princippet [2] .

Generelt princip for aktiv registrering

Lad der være en tabel i databasen . Til denne tabel oprettes en speciel AR -klasse , som er en afspejling (repræsentation) af tabellen på en sådan måde, at:

Implementering

Implementeringen af ​​AR-konceptet findes i mange udviklingsmiljøer for forskellige programmeringssprog. For eksempel, hvis databasen har en tabel med (strengtype) og (taltype) partsfelter , og Active Record-skabelonen er implementeret i klassen , så er følgende pseudokode: namepricePart

del = ny del() part.name = "Eksempel på del" del.pris = 123,45 part.save()

vil oprette en ny post i tabellen partsmed de givne værdier, og vil nogenlunde matche SQL - kommandoen

INSERT INTO dele ( navn , pris ) VÆRDIER ( 'Sample part' , 123 . 45 );

På den anden side kan klassen bruges til at forespørge databasen:

b = Part.find_first("navn", "gearkasse")

Denne kode vil oprette en ny forekomst af klassen Partbaseret på dataene fra den først fundet post i tabellen parts, der har et felt namesvarende til "gearkasse".

SQL-kommandoen kan ligne en af ​​følgende, afhængigt af implementeringen af ​​SQL i en bestemt database:

VÆLG * FRA dele WHERE navn = 'gearbox' LIMIT 1 ; -- MySQL eller PostgreSQL

eller

VÆLG * FRA dele WHERE navn = 'gearbox' og rækkenummer < 2 ; -- Oracle

eller

VÆLG TOP 1 * FRA dele HVOR navn = 'gearkasse' ; -- Microsoft SQL Server

Implementeringseksempler: Yii [3] og Kohana for PHP . Bemærkelsesværdigt er CodeIgniter-rammeværket , som har en indbygget ActiveRecord-klasse, der er en databaseforespørgselskonstruktør, men som ikke er et eksempel på en implementering af Active Record-mønsteret.

Se også

Noter

  1. Pablos SOLID Softwareudvikling 8. - "Et godt anti-eksempel er Active Record-mønsteret." Dette mønster er i modstrid med SRP. En domæneenhed håndterer persistens af sine oplysninger. (Bemærk: Der er ikke noget galt med at bruge Active Record; jeg har for nylig brugt det på et hurtigt demo-site, og det fungerede perfekt) Normalt ville du have en controller-metode/-handling videregive en "hydreret" enhed til en metode i et lager eksempel." Hentet 31. juli 2017. Arkiveret fra originalen 29. august 2017.
  2. Sergey Protko (fesor). AR krænker den per definition og er designet til at overtræde den.  // https://habrahabr.ru/.+ Arkiveret 31. juli 2017.
  3. Eksempel på brug af Active Record i Yii-rammerne Arkiveret 10. februar 2010 på Wayback Machine Arkiveret 10. februar 2010.

Links