5 секретов от супермоделей, которые помогают им держать себя в форме

На них мечтали быть похожими миллионы женщин. Все хотели иметь ноги, как у Синди или золотые локоны, как у Клаудии. Говорят, сейчас модельный мир уже не тот, нет индивидуальностей, все модели как по шаблону. Эти женщины были другими, каждая из них выделялась чем-то особенным. Но что с ними стало сейчас? Мы посмотрели, как выглядят и чем занимаются самые известные топ-модели из прошлого:

Клаудия Шиффер

Клаудия Шиффер — одна из самых высокооплачиваемых моделей прошлых лет. Ее тело в эпоху 90-х считалось эталоном: рост — 180 см, вес — 58 кг, грудь — 95 см, талия — 62 см, бедра — 92 см. За пресловутые 90-60-90 скажите спасибо Клаудии. За свою карьеру знаменитая немка побывала на обложках глянца более девятисот раз, и этот рекорд еще не удалось побить никому. Сегодня Клаудии Шиффер 46 лет, и она все так же прекрасно выглядит. Своим секретом красоты топ-модель называет микс из правильного питания и регулярных занятий спортом.

Синди Кроуфорд

Фигура Синди Кроуфорд тоже считается эталонной: не зря комплекс видеотренировок от супермодели был распродан во всем мире многомиллионным тиражом. И все равно она была второй после Клаудии Шиффер.

Синди 51 год, но ее фигура все такая же стройная и подтянутая, как и 20 лет назад. Секрет — в регулярных занятиях спортом, сбалансированном рационе питания и оптимистичном взгляде на жизнь.

Линда Евангелиста

Уникальная внешность стала главным козырем Линды Евангелисты. Топ-модель начала карьеру на модном подиуме в начале 80-х годов и очень быстро стала одной из самых востребованных девушек в профессии. Зеленые миндалевидные глаза, орлиный нос и бесконечно длинные ноги немедленно завоевали сердца мировых кутюрье. Когда-то очень давно Линда опрометчиво сказала: «Я даже не встану с постели меньше чем за 10 тысяч долларов». Эту фразу комментировали все модные журналы, а Линда сейчас сожалеет о сказанном. «Эти слова преследуют меня везде. Я сказала это очень давно, и, надеюсь, что сегодня я уже совсем другой человек. Теперь я встаю с постели по гораздо более важным причинам».

Сегодня некогда идеальное лицо Линды осталось в прошлом. И дело совсем не в возрасте, а в увлечении пластической хирургией и инъекциями красоты.

Кейт Мосс

В начале 90-х Клаудии, Синди и Линде пришлось подвинуться — на модном небосклоне зажглась новая звезда. Кейт Мосс — супермодель, икона стиля и символ британского шика. Ее обвиняли в анорексии, пристрастии к алкоголю и наркотикам, но это не мешало девушке заключать многомиллионные контракты с монстрами индустрии и регулярно появляться на обложках глянца.

Сегодня Кейт 43 года, ее критикуют за неухоженный внешний вид и пренебрежительное отношение к себе. Но, кажется, Мосс глубоко наплевать на критику, она вполне довольна своей внешностью.

Наоми Кэмпбелл

Наоми Кэмпбелл стала первой темнокожей моделью, которая появилась на обложке журнала Time, а также французского и английского Vogue. Кстати, прозвище Черная Пантера ей дали вовсе не за цвет кожи, а за хорошую пластику и кошачью манеру походки по подиуму.

Несмотря на свою бурную личную жизнь и скандальный характер, сегодня Наоми все так же хороша, как и в 90-е. Проблемы с волосами не в счет — последние несколько лет Черная Пантера носит парики, так как свои волосы модель испортила стягивающими прическами.

Кристи Бринкли

Модельер, актриса, фотограф, певица и даже писательница — все это о Кристи Бринкли. Но в первую очередь Кристи известна все-таки как знаменитая американская топ-модель, чья карьера началась еще в 80-х годах прошлого века.

Поговаривают, что Бринкли нашла эликсир молодости (или продала душу дьяволу), потому что в свои 63 года звезда выглядит в два раза моложе. А пока весь мир гадает, как ей это удалось, Кристи всячески отрицает любые вмешательства в свою внешность, утверждая, что главный секрет ее молодости и красоты — вегетарианство.

Дженис Дикинсон

Сначала Дженис Дикинсон покорила европейские подиумы, и только в начале 80-х она вернулась в Нью-Йорк, где стала одной из самых востребованных моделей на рынке.

Дженис вела разгульный образ жизни, вместо еды предпочитала кокаин, но поначалу это не мешало ей оставаться настоящей красоткой. Потом была «Модельная школа ведьмы Дженис», а потом… бесконечная пластика, которая привела к тому результату, который мы видим сегодня.

Твигги

Твигги была лицом Лондона 60-х, но, несмотря на грандиозный успех, девушка решила завершить модельную карьеру в самом расцвете сил.

Сегодня Лесли Хорнби (настоящее имя Твигги) 67 лет и в ней, конечно, сложно узнать ту хрупкую девушку с огромными глазами и бесконечно длинными ресницами. Бывшая модель выглядит гармонично и ухоженно и не пытается бороться с возрастными изменениями.

Карла Бруни

Карла Бруни попробовала себя в разных ипостасях: в начале 90-х — успешная супермодель, в нулевых — певица с четырьмя альбомами, в 2008 году — первая леди Франции. Высокие скулы, идеальный овал лица, миндалевидные глаза — внешности Карлы завидовали миллионы начинающих моделей.

Но возраст не щадит даже признанных красавиц. Решив омолодиться, Карла сделала не самую удачную пластику. Результат мы все видим.

Кристи Тарлингтон

Еще одна звезда подиумов — супермодель Кристи Тарлингтон. На ее счету более 500 глянцевых обложек, миллионные контракты с косметическими брендами и статус самого успешного лица Calvin Klein за всю историю существования марки.

Кристи никогда не делала пластику, не использовала филлеры и до сих пор говорит нет ботоксу. Она отлично выглядит и совершенно не переживает по поводу возраста.

Критика[ | ]

Критика «супермодельной индустрии» время от времени появляется и в модной прессе, и в других СМИ. Одни критики утверждают, что в стремлении соответствовать стандартам красоты, диктуемым модными журналами, тревожное количество девочек и молодых женщин искусственно истощает свой организм и в результате заболевает анорексией или булимией[97][98]. Другие обвиняют модельную индустрию в расизме, утверждая, что подавляющее большинство супермоделей отражают исключительно северно-американские стандарты красоты. «Сегодня в фаворе модели, похожие на безликих андроидов, — пишет обозреватель моды Ги Трибей в New York Times

, ссылаясь на мнение известного модельного агента, — Их внешний вид не составляет конкуренцию одежде. В нынешнем климате темнокожих моделей продвигать куда трудней, чем моделей такого же класса, но белых»[96][99]. Карл Лагерфельд подобную критику отвергает и, в свою очередь, обвиняет прессу в «политкорректном фашизме»[100].

В популярной культуре термин «супермодель» в последнее время употребляется более широко и нередко по отношению к новым моделям, которые недосягаемо далеки от статуса супермоделей. «Термин „супермодель“ — создание прессы, — утверждает Линда Евангелиста. — Сами мы супермоделями себя никогда не называли»[58].

Хайди Клум, Германия

С конца 90-х Клум является одной из самых известных моделей в мире. Она сотрудничает с Katjes, McDonald’s, Taft и другими популярными брендами. Хайди Клум выгодно распоряжается своей популярностью – с ее помощью она продвигает собственную продукцию. Это сладости, одежда, линейка парфюмерии и т.д. Ежегодный доход Клум составляет 20 миллионов долларов.

В 2020 году модели исполнится 47 лет, но несмотря на возраст, Хайди Клум способна дать фору любой молодой девушке. Ей удается оставаться примером красоты и женственности, даже принимая во внимание тот факт, что Клум – многодетная мать.

всемирно известная ТОП-модель

Примечания[ | ]

  1. The 20 Richest Women In Entertainment/Forbes.
  2. 12
    Gisele Bündchen — Forbes, Forbes.com. Проверено 14 июля 2011.
  3. 12Foltz, Kim
    . All About Cover Girls; The Look That Sells Is Both Girl-Next-Door and Celebrity (англ.),
    The New York Times
    (24 May 1992). Дата обращения 13 июля 2011.
  4. 12Bonin, Liane
    . Model Citizens (англ.), Entertainment Weekly (13 November 2008). Дата обращения 12 июля 2011.
  5. Patrick, Kate
    . New Model Army (англ.), The Scotsman (21 May 2005). Дата обращения 12 июля 2011.
  6. Модель, Ozon.ru (2005). Дата обращения 12 июля 2011.
  7. Matthews, Clyde. «So you want to be a model!». Halcyon House, Carden City, N.Y, 1948. Second Printing. ASIN B000K7U8AU. Проверено 13 июля 2011.
  8. 12
    BarryPopik.com Supermodel July 25, 2004
  9. Curtis, Charlotte
    . Twiggy: She’s Harlow, and the Boy Next Door (англ.), The New York Times (21 March 1967). Дата обращения 12 июля 2011.
  10. Cokal, Susann. «Supermodels», St. James Encyclopedia of Popular Culture. 1999. Michigan. Gale Group.
  11. Supermodels, Amazon.com. Дата обращения 18 июля 2011.
  12. . Archived from Ebay.co.uk. Subheadline says, «New York’s new supermodel, Margaux Hemingway»
  13. 12
    Dickinson, Janice. Instinct Magazine: Janice Dickinson Archived from original link. 2006-06-01.
    InstinctMagazine.com
    Retrieved 2011-07-15.
  14. Ranck, Rosemary
    . The First Supermodel (англ.), The New York Times (9 February 1997). Дата обращения 12 июля 2011.
  15. Christian Dior: Lisa Fonssagrives lives (англ.). China Daily
    (1 July 2008). Дата обращения 12 июля 2011. Архивировано 14 августа 2012 года.
  16. Singh, Anita
    . Photographs of Angelina Jolie, Kate Moss and Britney Spears for sale at Christie’s,
    The Daily Telegraph
    (13 ноября 2008).
  17. Cheesman, Chris.
    Pictures: Original stills from JFK assassination revealed (англ.) (недоступная ссылка).
    Amateur Photographer
    (19 October 2007). Дата обращения 12 июля 2011. Архивировано 24 октября 2007 года.
  18. Johnson, Geoffrey.
    On the life and work of photographer Beatrice Tonnesen (англ.). Chicagomag.com (March 2010). Дата обращения 12 июля 2011. Архивировано 14 августа 2012 года.
  19. Archetypal supermodel was more than a face (англ.). The Australian
    (16 July 2008). Дата обращения 14 июля 2011. Архивировано 23 ноября 2012 года.
  20. World’s first supermodel dies (англ.). Metro.co.uk (11 July 2008). Дата обращения 12 июля 2011. Архивировано 14 августа 2012 года.
  21. Bumpus, Jessica.
    Dorian Leigh Remembered (англ.) (недоступная ссылка).
    Vogue
    (14 July 2008). Дата обращения 15 июля 2011. Архивировано 27 декабря 2010 года.
  22. Busch, Charles.
    He’s Every Woman (англ.).
    Advocate Magazine
    (24 January 1995). Дата обращения 12 июля 2011.
  23. Magee, Antonia.
    Model Jean Shrimpton recollects the stir she caused on Victoria Derby Day in 1965 (англ.).
    Herald Sun
    (28 October 2009). Дата обращения 12 июля 2011. Архивировано 14 августа 2012 года.
  24. Susan Cohen, Christine Cosgrove.
    Normal at Any Cost: Tall Girls, Short Boys, and the Medical Industry’s Quest to Manipulate Height (англ.).
    Tarcher
    (2009). Дата обращения 18 июля 2011.
  25. Jean Shrimpton In Melbourne (неопр.)
    . Milesago.com. Дата обращения 15 июля 2011. Архивировано 14 августа 2012 года.
  26. Vallely, Paul
    . Gia: The tragic tale of the world’s first supermodel (англ.),
    The Independent
    (10 September 2005). Архивировано 1 января 2008 года. Дата обращения 14 июля 2011.
  27. Carolin, Louise
    Gia — the tragedy of a lesbian supermodel
    (неопр.)
    (недоступная ссылка).
    Diva Magazine
    . Дата обращения 15 июля 2011. Архивировано 25 марта 2007 года.
  28. Curtis, Bryan.
    The Sports Illustrated Swimsuit Issue: An intellectual history
    (неопр.)
    . Slate.com (16 февраля 2005). Дата обращения 12 июля 2011. Архивировано 14 августа 2012 года.
  29. Fonseca, Nicholas
    Entertainment Weekly: »Papa’s Little Girl»
    (неопр.)
    . Ew.com (29 июня 2001). Дата обращения 15 июля 2011. Архивировано 14 августа 2012 года.
  30. Barron, James
    . SIGNOFF; Maybe Late-Night Success Is About The Smile, The New York Times (24 сентября 1995). Дата обращения 15 июля 2011.
  31. Lauren Hutton, IMDB Проверено 17 июля 2011
  32. LAUREN HUTTON: THE WILD ONE Архивная копия от 23 августа 2012 на Wayback Machine, Harper’s Bazaar (13 January 2011) Проверено 17 июля 2011
  33. Iman: Supermodel and Beauty Innovator, Teenvogue.com
  34. Michelle Obama not a ‘great beauty’, says model Iman, The Telegraph (15 мая 2009). Дата обращения 12 июля 2011.
  35. Wilson, Eric
    . Naomi Sims, 61, Pioneering Cover Girl, Is Dead (англ.),
    The New York Times
    (3 August 2009). Дата обращения 15 июля 2011.
  36. Madden, Lance
    . Kate Upton on the Cover of Sports Illustrated Swimsuit Issue for Second Consecutive Year (англ.),
    Forbes
    (8 февраляя 2013). Дата обращения 13 мая 2013.
  37. 12
    Linda Evangelista
    (неопр.)
    . YOU.com.au. Дата обращения 15 июля 2011. Архивировано 14 августа 2012 года.
  38. Наоми Кэмпбелл обвинила шоколадную империю в расизме, Правда.Ру
    (30 мая 2011) Проверено 17 июля 2011
  39. Gaultier Tackles 51-Year-Old Model Inès de la Fressange on His Runway (англ.), New York Magazine
    (29 January 2009). Дата обращения 13 июля 2011.
  40. 123Justine Elias
    . A Chic Heroine, but Not a Pretty Story, The New York Times (25 января 1998). Дата обращения 14 июля 2011.
  41. Kuczynski, Alex
    . In Her Fashion (англ.),
    The New York Times
    (8 April 2007). Дата обращения 16 июля 2011.
  42. 12Skow, John
    . Modeling the ’80s Look: The Faces and Fees are Fabulous (англ.), Time (9 February 1981). Дата обращения 18 июля 2011.
  43. Эль Макферсон: место под солнцем, Glamour (10 января 2008). Архивировано 14 января 2020 года. Дата обращения 13 июля 2011.
  44. 1234
    The World’s Top-Earning Models-Forbes Magazine (англ.). Forbes.com (19 July 2007). Дата обращения 14 июля 2011. Архивировано 14 августа 2012 года.
  45. Christie Brinkley’s biography in the New York Times (неопр.)
    . New York Times. Дата обращения 13 июля 2011.
  46. 1234
    1980s: Fashion: Supermodels bookrags.com. Retrieved July 14, 2011.
  47. 1980s: Fashion: Supermodels bookrags.com. Retrieved July 15, 2011.
  48. Blanket cover for bride Schiffer (неопр.)
    . BBC (25 мая 2002). Дата обращения 13 июля 2011. Архивировано 14 августа 2012 года.
  49. 12
    Алессандра Амбросио,
    Tatler
    (9 января 2011) Проверено 17 июля 2011
  50. Линда Евангелиста, Cosmopolitan
    . Архивировано 23 марта 2014 года. Дата обращения 13 июля 2011.
  51. Phillips de Pury & Company announces the Highlights From Its London Photographs Sale (англ.), Phillips de Pury & Company. Дата обращения 18 июля 2011. (недоступная ссылка)
  52. Vogue Memories (англ.), Vogue. Дата обращения 13 июля 2011. (недоступная ссылка)
  53. 12Wilson, Alex
    . We Three Queens (англ.), New York Magazine (7 April 2003). Архивировано 28 февраля 2006 года. Дата обращения 16 июля 2011.
  54. 12345
    The Fall of the Supermodel Time. Retrieved July 13, 2011
  55. Saner, Ermine.
    The Forgotten Supermodel (неопр.) // The Gaurdian UK. — 2009. — 15 January. — С. page 12, G2 section.
  56. 123
    The supermodel is dead, says Claudia Schiffer, Evening Standard. Архивировано 12 августа 2009 года. Дата обращения 15 июля 2011.
  57. Supermodel’s life in the spotlight, BBC News
    (27 марта 2002). Дата обращения 14 июля 2011.
  58. 123Kuczynski, Alex
    . Trading on Hollywood Magic; Celebrities Push Models Off Women’s Magazine Covers (англ.),
    The New York Times
    (3 August 2009). Дата обращения 17 июля 2011.
  59. Naomi Campbell Interview – The Face, Tyra, the ’90s & Tough Love (англ.), Realstylenetwork.com. Дата обращения 15 февраля 2013.
  60. Gianfranco Ferre выбрал Джулию Робертс, News.rin.ru
    (16 декабря 2005). Дата обращения 15 июля 2011.
  61. 12Gross, Michael
    . Supermodels: Hot as Ever Or on Ice?;… but Fashion May Be Fed Up (англ.),
    The New York Times
    (21 April 1996). Дата обращения 13 июля 2011.
  62. 12White, Constance
    . Dry Eyes for Ferre, Boos for Lagerfeld (англ.),
    The New York Times
    (10 October 1996). Дата обращения 15 июля 2011.
  63. Supermodel by Heidi Klum randomhouse.com. Retrieved July 22, 2007.
  64. Немецкая супермодель о любви к мужскому стилю, женственным платьям и лондонскому шопингу Архивная копия от 16 мая 2011 на Wayback Machine, Harper’s Bazaar (Июнь 2010) Проверено 17 июля 2011.
  65. 12Menkes, Suzy
    . In Milan: Avedon’s work for Versace,
    The New York Times
    (2 декабря 2008). Дата обращения 15 июля 2011.
  66. Helena Christensen: on supermodels and posing nude at 40, The Daily Telegraph (29 ноября 2009) Проверено 17 июля 2011.
  67. Супермодель Карен Мюльдер пыталась покончить жизнь самоубийством Newsinfo.ru
  68. Laetitia Casta — SUPERMODEL (англ.) (недоступная ссылка). Newfaces.com (11 May 1978). Дата обращения 11 июля 2011. Архивировано 6 января 2011 года.
  69. Vivienne, Walt
    . Sarkozy and the Supermodel (англ.),
    Time
    (17 December 2007). Дата обращения 13 июля 2011.
  70. Время для него, Harper’s Bazaar (май 2006). Архивировано 11 октября 2011 года. Дата обращения 17 июля 2011.
  71. Stella Tennant (англ.), Vogue. Архивировано 12 августа 2011 года. Дата обращения 13 июля 2011.
  72. Daniela Pestova (англ.), New York Magazine. Дата обращения 16 июля 2011.
  73. Supermodel Eva Herzigova writes for Vogue Архивная копия от 3 июня 2011 на Wayback Machine, Paris Match (27 мая 2009) Проверено 17 июля 2011.
  74. 10 самых высокооплачиваемых супермоделей мира, TimeOut (18 января 2010). Дата обращения 13 июля 2011.
  75. White, Constance
    . Modeling: Whose Problem? (англ.),
    The New York Times
    (8 April 1997). Дата обращения 15 июля 2011.
  76. 12
    New Supers — models.com
  77. Наоми Кэмпбелл против слова «супермодель», Glamour (22 июля 2008). Архивировано 23 марта 2014 года. Дата обращения 13 июля 2011.
  78. Gisele Bündchen.
    Celebrity Central: Gisele Bundchen biography
    (неопр.)
    . People.com. Дата обращения 11 июля 2011. Архивировано 14 августа 2012 года.
  79. Звезда Victoria’s Secret Адриана Лима стала мамой, Glamour (19 ноября 2009). Архивировано 20 января 2012 года. Дата обращения 13 июля 2011.
  80. Payne, Mike
    . Angela Lindvall Heats Up H&M (англ.), Stylecrave. Архивировано 11 февраля 2010 года. Дата обращения 16 июля 2011.
  81. Angela Lindvall (англ.), New York Magazine. Дата обращения 16 июля 2011.
  82. Карен Элсон, Vogue.ru. Архивировано 7 июля 2011 года. Дата обращения 13 июля 2011.
  83. Как цветок в оранжерее, Vogue.ru (16 июня 2011). Дата обращения 13 июля 2011.
  84. Весенний марафон Водяновой, Vogue.ru (9 марта 2011). Архивировано 17 марта 2011 года. Дата обращения 13 июля 2011.
  85. Мариякарла Босконо, Vogue.ru. Дата обращения 26 мая 2013.
  86. Malgosia Bela, Models.com. Дата обращения 13 июля 2011.
  87. Malgosia Bela (англ.), New York Magazine. Дата обращения 16 июля 2011.
  88. ЛИЯ КЕБЕДЕ – НОВОЕ ЛИЦО L’OREAL PARI, Elle.ru (22 июня 2011). Дата обращения 13 июля 2011.
  89. 12Юрьева, Дарья
    . Славянки не прощаются, Российская газета (29 апреля 2005). Дата обращения 15 июля 2011.
  90. Inguna Butane (англ.), New York Magazine
    . Дата обращения 13 июля 2011.
  91. Barracato, Joseph
    . Model behavior (англ.), New York Post (8 August 2010). Дата обращения 13 июля 2011.
  92. Саша Пивоварова, Vogue.ru (7 июня 2011). Архивировано 8 августа 2011 года. Дата обращения 20 июля 2011.
  93. Natasha Poly (англ.), Models.com. Дата обращения 13 июля 2011.
  94. Vogue Diaries: Hit Girls, World News. Дата обращения 20 июля 2011.
  95. Vogue U.S. Май 2007. Проверено 16 июля 2011.
  96. 12Jones, LaMont
    . Black and beautiful: African-American women haven’t had an easy time in the fashion world (англ.),
    Pittsburgh Post-Gazette
    (23 April 2007). Дата обращения 20 июля 2011.
  97. Скончалась боровшаяся с анорексией модель, Лента.ру (30 декабря 2010). Дата обращения 12 июля 2011.
  98. Hari, Johann
    . Johann Hari: The fashion industry imposes a cruel burden on women (англ.), The Independent (16 September 2009). Дата обращения 12 июля 2011.
  99. Trebay, Guy
    . On fashion runways, racial diversity is out (англ.), The New York Times (22 October 2007). Дата обращения 12 июля 2011.
  100. Nussbaum, Emily
    . The Incredible Shrinking Model (англ.),
    New York Magazine
    (18 February 2007). Дата обращения 22 июля 2011.

Клаудия Шиффер, Германия

Немецкая супермодель находится в книге рекордов Гинесса как женщина, которая появляется на обложках журналов чаще других. Только за 2020 год фото Клаудии Шиффер мелькало на обложках более тысячи раз. В разное время Шиффер участвовала в показах почти всех известных домов моды.

В 90-х годах Клаудия была самой узнаваемой девушкой. Окружающие отмечали ее деловую хватку и высокий профессионализм. Гонорар Шиффер в лучшие годы составлял 50 тысяч долларов в день.

немецкая супермодель

Каждая из этих женщин – профессионал своего дела. Отдадим должное природной красоте, но и не будем забывать, что за каждым успехом лежит колоссальный труд и немного удачи.

Литература[ | ]

  • Cohen, Susan. Cosgrove, Christine. «Normal at Any Cost: Tall Girls, Short Boys, and the Medical Industry’s Quest to Manipulate Height». Tarcher, 2009. ISBN 1-58542-683-0
  • Васильева, Екатерина. Русские модели
    . Москва: Амфора, 2007. ISBN 978-5-367-00574-5
  • Гросс, Майкл. Модель
    . Ред Фиш, Амфора, 2005. ISBN 5-483-00124-9
  • Halperin, Ian. Bad And Beautiful: Inside the Dazzling and Deadly World of Supermodels
    . Citadel, 2003. ISBN 978-0-8065-2456-6
  • Dickinson, Janice. No Lifeguard on Duty: The Accidental Life of the World’s First Supermodel
    . Harper Entertainment, 2002. ISBN 978-0-06-000946-5
  • Pendergast, Sara. St. James Encyclopedia of Popular Culture
    . Gale Group, 1999. ISBN 978-1-55862-400-9
  • Morris, Sandra. Catwalk: Inside the World of the Supermodel
    . Universe Publishing, 1996. ISBN 978-0-7893-0056-0
  • Matthews, Clyde. So you want to be a model!
    . Halcyon House, Carden City, N.Y, 1948. Second Printing ASIN[en] B000K7U8AU

Модели — это сущности, а не таблицы

В большинстве случаев проектирование системы начинается именно со структуры данных (БД). И дальше уже проектирование моделей также отталкивается от их хранения, т.е. от таблиц. Но это в корне неправильный подход.

Рассмотрим подробнее на примере блога.

Какие модели мы имеем:

  1. Пост
  2. Автор
  3. Комментарий
  4. Тэги
  5. Категории

Чтобы не было нагромождения кода, рассматривать будем только модель поста и наращивать функционал будет постепенно.

Начнем с поста:

interface PostRepository { public function save(Post $model); } class Post { protected $id; protected $title; protected $content; public function setId(int $id) { $this->id = $id; } public function getId(): ?int { return $this->id; } public function setTitle(string $title) { $this->title = $title; } public function getTitle(): string { return $this->title ?: »; } public function setContent(string $content) { $this->content = $content; } public function getContent(): string { return $this->content ?: »; } }

Работа с такой моделью и репой, будет выглядеть примерно так:

$post = new Post(); $post->setTitle(‘Title’); $post->setContent(‘…’); $repo->save($post);

Теперь внедрим сущность Автор, для этого нам нужно добавить методы в исходную модель:

class Post { // … protected $author; public function setAuthor(Author $author) { $this->author = $author; } public function getAuthor(): Author { return $this->author; } }

Пример работы:

$author = $authorRepo->getById(1); $post->setAuthor($author); $repo->save($post);

Теперь внедрим сущность Комментарий, в данной ситуации тоже бы добавить сеттер и соответствующее поле, но если говорить про бизнес-смыслы, то у нас нет такого понятия как «указать комментарии», у нас есть такие понятия как «добавить комментарий» и «удалить комментарий».

Поэтому нашу исходную модель преобразуем таким образом:

class Post { // another code protected $comments; protected $addComments = []; protected $removeComments = []; public function getComments() { return $this->comments; } public function addComment(Comment $comment) { $this->addComments[] = $comment; } public function getAddComments() { return $this->addComments; } public function removeComment(Comment $comment) { $this->removeComments[] = $comment; } public function getRemoveComments() { return $this->removeComments; } }

Работа с комментариями в таком случае у нас будет выглядеть так:

$newComment = new Comment(); $newComment->setContent(«…»); $removeComment = $commentRepo->getById(1); $post->addComment($newComment); $post->removeComment($removeComment); $repo->save($post);

В момент сохранения поста, у нас также должны обрабатываться удаление и добавление комментариев.

Но сам PostRepository не должен работать с хранилищем комментариев, он должен делегировать это на CommentRepository.

То есть репозиторий постов, должен выглядеть примерно так:

class ConcretePostRepository implements PostRepository { protected $commentRepository; public function setCommentRepository(CommentRepository $commentRepository) { $this->commentRepository = $commentRepository; } public function save(Post $post) { if ($post->getId()) { $this->update($post); } else { $this->insert($post); } foreach ($post->getAddComments() as $comment) { $this->commentRepository->save($comment); $this->linkCommentToPost($post, $comment); } foreach ($post->getRemoveComments() as $comment) { $this->unlinkCommentToPost($post, $comment); $this->commentRepository->remove($comment); } } }

При этом важно учесть, что если мы посмотрим на связь «пост — комментарий» со стороны комментария, то у нас не должно быть метода setPost, т.к. он нарушает связь «целое — часть».

Причем метод getPost эту логику не нарушает и вполне может существовать.

В примере ниже, мы меняем «владельца» комментария, что противоречит бизнес-логике: мы не можем комментарий переместить в другой пост, мы можем только добавить, удалить или изменить комментарий.

$post = $repo->getById(1); $comment = new Comment(); $comment->setContent(‘…’); $comment->setPost($post); // этого метода быть не должно! $commentRepo->save($comment); $post = $comment->getPost(); // данный метод корректен

Перейдем к сущности Тэги, если говорить про бизнес-смысл, то здесь вполне корректным является действие «установить тэги».

Но если говорить про удобство использования, методы addTag и removeTag также стоит добавить.

Таким образом дополняем модель следующими методами:

class Post { // another code protected $tags; public function setTags(TagCollection $tags) { $this->tags = $tags; } public function addTag(Tag $tag) { if (!$this->tags) { $this->tags = new TagCollection; } $this->tags->add($tag); } public function removeTag(Tag $tag) { if ($this->tags instanceof TagCollection) { $this->tags->remove($tag); } } }

Работа с тегами будет выглядеть так:

$tag1 = $tagRepo->getById(1); $tag2 = new Tag(); $tag2->setValue(‘…’); $tag3 = $tagRepo->getById(3); $post->setTags(new TagCollection($tag1, $tag2)); // или $post->addTag($tag1); $post->addTag($tag2); $post->removeTag($tag3); $repo->save($post);

Если посмотреть на связь «пост — тэги» со стороны сущности Тэги, то мы опять не может добавить метод setPosts т.к. нарушаем связь «целое — часть» (потому что post has tag, а не tag has post).

Но при этом и метод getPosts мы также не можем использовать, потому что он также нарушает связь «целое — часть».

Правильным решение будет вынести метод получения списка постов конкретного тега в репозиторий:

interface PostRepository { public function getListByTag(Tag $tag); }

Ну и наконец перейдем к сущности Категории.

Казалось бы тут все тоже самое что и у тэгов, но как раз наоборот: с точки зрения бизнес-логики посты являются частью категорий, т.е. посты «складываются» в категории как в папки, а не категории привязываются к постам, как в случае с тэгами.

Поэтому в модель поста вы добавляем лишь геттер:

class Post { // another code protected $categories; public function getCategories() { return $this->categories; } }

А работа с категориями будет выглядеть так:

$post = $postRepo->getById(1); $cat1 = $categoryRepo->getById(1); $cat1->addPost($post); $categoryRepo->save($cat1); // сохраняем привязку к категории $cat2 = $categoryRepo->getById(2); $cat2->addPost($post); $categoryRepo->save($cat2); // сохраняем привязку к категории $cat3 = $categoryRepo->getById(3); $cat3->removePost($post); $categoryRepo->save($cat3); // убираем привязку к категории [$cat1, $cat2] = $post->getCategories();

Бизнес-действия

Если посмотреть на конечную реализацию модели Post, то можно заметить заметить, что она получилась достаточно громоздкой.

А если еще внимательнее посмотреть, что она совсем не содержит никаких действий, а только хранит данные.
Post.php
class Post { protected $id; protected $title; protected $content; protected $author; protected $tags; protected $comments; protected $addComments = []; protected $removeComments = []; public function setId(int $id) { $this->id = $id; } public function getId(): ?int { return $this->id; } public function setTitle(string $title) { $this->title = $title; } public function getTitle(): string { return $this->title ?: »; } public function setContent(string $content) { $this->content = $content; } public function getContent(): string { return $this->content ?: »; } public function setAuthor(Author $author) { $this->author = $author; } public function getAuthor(): Author { return $this->author; } public function getComments() { return $this->comments; } public function addComment(Comment $comment) { $this->addComments[] = $comment; } public function getAddComments() { return $this->addComments; } public function removeComment(Comment $comment) { $this->removeComments[] = $comment; } public function getRemoveComments() { return $this->removeComments; } public function setTags(TagCollection $tags) { $this->tags = $tags; } public function addTag(Tag $tag) { if (!$this->tags) { $this->tags = new TagCollection; } $this->tags->add($tag); } public function removeTag(Tag $tag) { if ($this->tags instanceof TagCollection) { $this->tags->remove($tag); } } }

Например, при добавлении комментария к посту, у нас автоматически должно уходить уведомление автору этого поста.

Причем уходить уведомление должно, только после сохранения комментария. Чтобы решить и ту и другую задачу, можно ввести «бизнес-действия», которые будут обрабатываться в момент сохранения.

Это атомарные классы, которые выполняют одно конкретное действие. Интерфейсы могут выглядеть таким образом:

abstract class BusinessOperation { abstract public function run(); public static function createInstance(): self { // DI контейнер return Container::getInstance()->make(get_called_class()); } } abstract class Model { private $operations = []; protected function addOperation(BusinessOperation $item) { $this->operations[] = $item; } public function getOperations(): array { return $this->operations; } }

Реализация действия «уведомить автора поста» может выглядеть так:

class NotifyAuthorAboutComment extends BusinessOperation { protected $service; protected $post; public function __construct(NotifyService $service) { $this->service = $service; } public function setPost(Post $post) { $this->post = $post; } public function run() { $author = $this->post->getAuthor(); $notify = new Nofity(); $notify->setOwner($author); $notify->setContent(«Новые комментарий к записи ‘{$this->post->title}'»); $this->service->send($notify); } }

Соответственно репозиторий у нас тоже становиться более абстрактным и будет выглядеть так:

abstract class ModelRepository { protected function saveInternal(Model $model) { try { $this->startTransaction(); if ($model->isNewRecord()) { $this->insert($model); } else { $this->update($model); } foreach ($model->getOperations() as $operation) { $operation->run(); } $this->commitTransaction(); } catch (Throwable $e) { $this->rollbackTransaction(); throw $e; } } } class ConcretePostRepository extends ModelRepository implements PostRepository { public function save(Post $post) { $this->saveInternal($post); } }

А реализация самой модели становится более краткой, более понятной и удобной к расширению:

Post.php

class Post extends Model { protected $id; protected $title; protected $content; protected $author; protected $tags; protected $comments; public function setId(int $id) { $this->id = $id; } public function getId(): ?int { return $this->id; } public function setTitle(string $title) { $this->title = $title; } public function getTitle(): string { return $this->title ?: »; } public function setContent(string $content) { $this->content = $content; } public function getContent(): string { return $this->content ?: »; } public function setAuthor(Author $author) { $this->author = $author; } public function getAuthor(): Author { return $this->author; } public function getComments() { return $this->comments; } public function addComment(Comment $comment) { $action = AddComment::createInstance(); $action->setPost($this); $action->setComment($value); $this->addOperation($action); $action = NotifyAuthorAboutComment::createInstance(); $action->setPost($this); $this->addOperation($action); } public function removeComment(Comment $comment) { $action = RemoveComment::createInstance(); $action->setPost($this); $action->setComment($value); $this->addOperation($action); } public function setTags(TagCollection $tags) { $this->tags = $tags; } public function addTag(Tag $tag) { if (!$this->tags) { $this->tags = new TagCollection; } $this->tags->add($tag); } public function removeTag(Tag $tag) { if ($this->tags instanceof TagCollection) { $this->tags->remove($tag); } } }

Почему плохо нарушать связь «целое — часть»

Ранее неоднократно упоминалось что мы не можем реализовать тот или иной метод из-за нарушения связи «целое — часть».

Рассмотрим на примере процедуры оформления заказа, чтобы понять насколько критично может быть нарушение данной связи.

Входные данные: заказ у нас имеет товары, информацию об оплате и доставке, при изменении статуса оплаты у нас меняется статус самого заказа, статус доставки (разрешается доставка) и отправляются уведомления ответственным сотрудникам и самому клиенту.

Допустим мы получили от клиента оплату и сохраняем ее таким образом:

// в данной ситуации не важно как мы получили объект оплаты, важно то как мы его сохранили $payment = $repo->getById(1); $payment = $order->getPayment(); $payment->setPaidAmount(100); if ($payment->isPaid()) { $payment->setStatus(IS_PAID); } $repo->save($payment);

Что произойдет?

Мы изменим сумму и статус оплаты, и полностью проигнорируем остальную цепочку действий. Но если обработку полученной оплаты мы будем выполнять таким образом:

$order = $repo->getById(1); $order->setPaidAmount(100); $repo->save($order);

То при сохранении заказа выполнятся все связные действия и обновятся все необходимые данные.

Очень важно контролировать связь «целое — часть», чтобы бизнес-логика отрабатывала как нужно.

На самом деле все кроется на уровне формулировок: вместо «получили оплату», нужно использовать формулировку «получили оплату по заказу», и тогда станет ясно где целое и как нужно обработать данные.

Рейтинг
( 1 оценка, среднее 4 из 5 )
Понравилась статья? Поделиться с друзьями: