{"id":32458,"date":"2025-10-22T02:31:17","date_gmt":"2025-10-21T23:31:17","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/"},"modified":"2025-10-22T02:31:17","modified_gmt":"2025-10-21T23:31:17","slug":"concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/","title":{"rendered":"concerns\/ Klas\u00f6r\u00fc: Mimari D\u00fczenleyici mi, Dijital \u00c7\u00f6p Kutusu mu?"},"content":{"rendered":"<p>Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, \u00f6zellikle Ruby on Rails gibi modern framework&#8217;lerde s\u0131k\u00e7a kar\u015f\u0131m\u0131za \u00e7\u0131kan <code>concerns\/<\/code> klas\u00f6r\u00fc, kimi zaman bir kurtar\u0131c\u0131, kimi zaman ise bir karma\u015fa kayna\u011f\u0131 olabilir. Peki, bu dizin ger\u00e7ekten de kod taban\u0131n\u0131z\u0131 d\u00fczenleyen bir mimari harikas\u0131 m\u0131, yoksa kontrols\u00fcz b\u00fcy\u00fcyen bir &#8220;dijital \u00e7\u00f6p kutusu&#8221; mu? Bu makale, <code>concerns<\/code> klas\u00f6r\u00fcn\u00fcn derinliklerine inerek hem faydalar\u0131n\u0131 hem de olas\u0131 tuzaklar\u0131n\u0131 ayd\u0131nlat\u0131yor, do\u011fru kullan\u0131m senaryolar\u0131n\u0131 ve en iyi pratikleri ad\u0131m ad\u0131m inceliyor.<\/p>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme pratikleri, kod tekrar\u0131n\u0131 azaltmay\u0131, mod\u00fclerli\u011fi art\u0131rmay\u0131 ve sistemlerin bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131rmay\u0131 hedefler. Bu ba\u011flamda, <code>concerns\/<\/code> klas\u00f6r\u00fc, \u00f6zellikle Ruby on Rails ekosisteminde, modeller, kontrolc\u00fcler veya di\u011fer mod\u00fcller aras\u0131nda ortak davran\u0131\u015flar\u0131 ve mant\u0131\u011f\u0131 payla\u015fmak i\u00e7in pop\u00fcler bir \u00e7\u00f6z\u00fcm olarak ortaya \u00e7\u0131km\u0131\u015ft\u0131r. Ancak, her g\u00fc\u00e7l\u00fc ara\u00e7 gibi, <code>concerns<\/code> de yanl\u0131\u015f kullan\u0131ld\u0131\u011f\u0131nda, ba\u015flang\u0131\u00e7taki iyi niyetin aksine, kod taban\u0131n\u0131 daha karma\u015f\u0131k, anla\u015f\u0131lmaz ve y\u00f6netilemez hale getirebilir. Bu durum, geli\u015ftiriciler aras\u0131nda &#8220;<code>concerns<\/code> bir tasar\u0131m deseni mi, yoksa k\u00f6t\u00fc tasar\u0131mlar\u0131 gizleyen bir kara delik mi?&#8221; sorusunu s\u0131k\u00e7a g\u00fcndeme getirir. \u0130\u015fte tam da bu nedenle, bu yap\u0131y\u0131 t\u00fcm y\u00f6nleriyle ele almak, ne zaman ve nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 kavramak, uzun vadeli s\u00fcrd\u00fcr\u00fclebilirlik a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir.<\/p>\n<p>Bir projenin b\u00fcy\u00fcmesiyle birlikte, farkl\u0131 modellerin benzer \u00f6zelliklere sahip olmas\u0131 ka\u00e7\u0131n\u0131lmaz hale gelir. \u00d6rne\u011fin, bir\u00e7ok modelin &#8220;olu\u015fturulma tarihi&#8221;, &#8220;g\u00fcncellenme tarihi&#8221; gibi ortak zaman damgalar\u0131na veya &#8220;soft delete&#8221; (yumu\u015fak silme) gibi ortak silme mekanizmalar\u0131na ihtiyac\u0131 olabilir. Bu t\u00fcr durumlar, ortak mant\u0131\u011f\u0131 her modele ayr\u0131 ayr\u0131 kopyalamak yerine, merkezi bir yerde tan\u0131mlay\u0131p ihtiya\u00e7 duyulan her yerde kullanabilme ihtiyac\u0131n\u0131 do\u011furur. <code>concerns\/<\/code> klas\u00f6r\u00fc, tam da bu noktada devreye girerek bu t\u00fcr ortak davran\u0131\u015flar\u0131 izole etmeyi ve yeniden kullan\u0131labilir mod\u00fcller halinde paketlemeyi vaat eder. Bu yakla\u015f\u0131m, DRY (Don&#8217;t Repeat Yourself &#8211; Kendini Tekrar Etme) prensibine uygun d\u00fc\u015fer ve kod taban\u0131n\u0131n daha temiz, daha okunakl\u0131 ve daha s\u00fcrd\u00fcr\u00fclebilir olmas\u0131na yard\u0131mc\u0131 olabilir. Ancak bu potansiyel faydalar, bilin\u00e7li ve disiplinli bir kullan\u0131ma ba\u011fl\u0131d\u0131r. Aksi takdirde, her yere at\u0131lan k\u00fc\u00e7\u00fck, ilgisiz mant\u0131k par\u00e7ac\u0131klar\u0131ndan olu\u015fan bir y\u0131\u011f\u0131na d\u00f6n\u00fc\u015febilir ve beklenen faydalar\u0131n tam tersi sonu\u00e7lar do\u011furabilir. Bu nedenle, <code>concerns<\/code> kullan\u0131m\u0131 \u00fczerine derinlemesine bir inceleme yapmak, yaz\u0131l\u0131m mimarimizin sa\u011flam temeller \u00fczerine kurulu olmas\u0131n\u0131 sa\u011flamak ad\u0131na hayati bir ad\u0131md\u0131r.<\/p>\n<h2><code>concerns\/<\/code> Klas\u00f6r\u00fc Nedir ve Neden Ortaya \u00c7\u0131kt\u0131?<\/h2>\n<p><code>concerns\/<\/code> klas\u00f6r\u00fc, teknik olarak Ruby&#8217;nin mod\u00fcl yap\u0131s\u0131 ve <code>ActiveSupport::Concern<\/code> mod\u00fcl\u00fc etraf\u0131nda \u015fekillenmi\u015f bir organizasyonel prensiptir. Temel amac\u0131, Ruby on Rails uygulamalar\u0131nda modeller, kontrolc\u00fcler veya di\u011fer s\u0131n\u0131flar aras\u0131nda payla\u015f\u0131lan davran\u0131\u015flar\u0131 (metodlar, callback&#8217;ler, ili\u015fkiler vb.) ayr\u0131, k\u00fc\u00e7\u00fck ve odaklanm\u0131\u015f mod\u00fcller halinde grupland\u0131rmakt\u0131r. B\u00f6ylece, her bir ana s\u0131n\u0131f (\u00f6rne\u011fin bir <code>User<\/code> modeli), kendi temel sorumluluklar\u0131na odaklan\u0131rken, ortak \u00f6zelliklerini bu <code>concerns<\/code>&#8216;ler arac\u0131l\u0131\u011f\u0131yla &#8220;kar\u0131\u015ft\u0131rabilir&#8221; (mixin edebilir). Bu yap\u0131, kod tekrar\u0131n\u0131 azalt\u0131r, kod taban\u0131n\u0131 daha d\u00fczenli hale getirir ve \u00f6zellikle b\u00fcy\u00fck Rails uygulamalar\u0131nda s\u0131n\u0131f boyutlar\u0131n\u0131n kontrol alt\u0131nda tutulmas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<p>Peki, bu ihtiya\u00e7 neden ortaya \u00e7\u0131kt\u0131? Geli\u015fen Rails uygulamalar\u0131nda, model s\u0131n\u0131flar\u0131 zamanla a\u015f\u0131r\u0131 b\u00fcy\u00fcyebilir ve &#8220;ya\u011fl\u0131 model&#8221; (fat model) sendromu denen duruma yol a\u00e7abilir. Bir model, sadece veritaban\u0131 ile etkile\u015fimden sorumlu olmakla kalmay\u0131p, i\u015f kurallar\u0131, do\u011frulama mant\u0131\u011f\u0131, ili\u015fkiler, arama metodlar\u0131, yetkilendirme kurallar\u0131 gibi bir\u00e7ok farkl\u0131 sorumlulu\u011fu da \u00fcstlenebilir. Bu durum, model dosyalar\u0131n\u0131n y\u00fczlerce hatta binlerce sat\u0131ra ula\u015fmas\u0131na neden olur. B\u00f6yle \u015fi\u015fkin s\u0131n\u0131flar, anla\u015f\u0131lmas\u0131 zor, test edilmesi zahmetli ve bak\u0131m\u0131 imkans\u0131za yak\u0131n hale gelen yap\u0131lar yarat\u0131r. <code>concerns<\/code>, bu \u015fi\u015fkinli\u011fi azaltmak i\u00e7in bir \u00e7\u00f6z\u00fcm olarak sunulmu\u015ftur. Ortak veya yan sorumluluklar\u0131 ilgili <code>concerns<\/code>&#8216;lere ta\u015f\u0131yarak, ana model s\u0131n\u0131f\u0131n\u0131n daha sade ve tek bir sorumlulu\u011fa odaklanmas\u0131na yard\u0131mc\u0131 olur. Bu, ayn\u0131 zamanda Single Responsibility Principle (Tek Sorumluluk Prensibi &#8211; SRP) ile de uyum sa\u011flamaya \u00e7al\u0131\u015f\u0131r; her bir <code>concern<\/code>, belirli bir ortak davran\u0131\u015f k\u00fcmesini y\u00f6netir.<\/p>\n<h3><code>concerns<\/code> Neden Bir \u0130htiya\u00e7 Haline Geldi? (Problem)<\/h3>\n<p>Daha \u00f6nce de bahsedildi\u011fi gibi, model s\u0131n\u0131flar\u0131n\u0131n zamanla \u015fi\u015fmesi, yani &#8220;ya\u011fl\u0131 modeller&#8221; probleminin \u00f6n\u00fcne ge\u00e7mek <code>concerns<\/code>&#8216;in ana motivasyon kayna\u011f\u0131d\u0131r. \u00d6rne\u011fin, bir e-ticaret uygulamas\u0131nda hem <code>Product<\/code> hem de <code>Order<\/code> modellerinin bir <code>status<\/code> alan\u0131 olabilir ve bu stat\u00fcleri de\u011fi\u015ftiren benzer mant\u0131klara ihtiya\u00e7 duyabilirler. Veya hem <code>User<\/code> hem de <code>Comment<\/code> modelleri, bir kullan\u0131c\u0131n\u0131n veya bir yorumun &#8220;yay\u0131nlanm\u0131\u015f&#8221; olup olmad\u0131\u011f\u0131n\u0131 kontrol eden bir metoda sahip olabilir. Bu t\u00fcr durumlar, ayn\u0131 kod bloklar\u0131n\u0131 birden fazla yere kopyalamak anlam\u0131na gelir ki bu, yaz\u0131l\u0131m geli\u015ftirmenin en temel anti-paternlerinden biridir. Kopyalanan kod, bir de\u011fi\u015fiklik gerekti\u011finde her yerde g\u00fcncellenmek zorunda kal\u0131r ve bu da hata yapma olas\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<p><code>concerns<\/code>, bu kod tekrar\u0131n\u0131 ortadan kald\u0131rarak merkezi bir y\u00f6netim noktas\u0131 sunar. Bir kez bir <code>concern<\/code> tan\u0131mland\u0131\u011f\u0131nda, bu <code>concern<\/code>&#8216;i i\u00e7eren t\u00fcm s\u0131n\u0131flar otomatik olarak o davran\u0131\u015flara sahip olur. Bu, sadece kodu k\u0131saltmakla kalmaz, ayn\u0131 zamanda i\u015f mant\u0131\u011f\u0131nda bir de\u011fi\u015fiklik oldu\u011funda tek bir yerde de\u011fi\u015fiklik yapma avantaj\u0131 sa\u011flar. Ayr\u0131ca, kod taban\u0131n\u0131n okunabilirli\u011fini art\u0131r\u0131r \u00e7\u00fcnk\u00fc geli\u015ftiriciler, bir modelin temel sorumluluklar\u0131n\u0131 h\u0131zla kavrayabilir ve detayl\u0131 ortak davran\u0131\u015flar i\u00e7in ilgili <code>concerns<\/code> dosyalar\u0131na bakabilirler. Bu, \u00f6zellikle yeni bir geli\u015ftiricinin projeye dahil olmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r ve genel \u00f6\u011frenme e\u011frisini d\u00fc\u015f\u00fcr\u00fcr.<\/p>\n<h3><code>concerns<\/code> Klas\u00f6r\u00fc Ne T\u00fcr Davran\u0131\u015flar\u0131 Bar\u0131nd\u0131r\u0131r? (Kapsam)<\/h3>\n<p><code>concerns<\/code> klas\u00f6r\u00fcn\u00fcn ne t\u00fcr davran\u0131\u015flar\u0131 bar\u0131nd\u0131rmas\u0131 gerekti\u011fi, genellikle tart\u0131\u015fma konusu olan \u00f6nemli bir noktad\u0131r. Genel olarak, bir <code>concern<\/code> i\u00e7erisinde bulunmas\u0131 gerekenler:<\/p>\n<ul>\n<li><strong>Ortak Metodlar:<\/strong> Birden fazla model veya kontrolc\u00fc taraf\u0131ndan kullan\u0131lan yard\u0131mc\u0131 metodlar.<\/li>\n<li><strong>Callback&#8217;ler:<\/strong> <code>before_save<\/code>, <code>after_create<\/code> gibi ya\u015fam d\u00f6ng\u00fcs\u00fc hook&#8217;lar\u0131.<\/li>\n<li><strong>S\u0131n\u0131f Metodlar\u0131 (Scope&#8217;lar):<\/strong> Veritaban\u0131 sorgular\u0131 i\u00e7in ortak scope&#8217;lar (\u00f6rne\u011fin, <code>published<\/code>, <code>active<\/code>).<\/li>\n<li><strong>\u0130li\u015fkiler:<\/strong> Belirli bir desenin par\u00e7as\u0131 olan <code>has_many<\/code>, <code>belongs_to<\/code> gibi ili\u015fkiler.<\/li>\n<li><strong>Validasyonlar:<\/strong> Ortak do\u011frulama kurallar\u0131.<\/li>\n<\/ul>\n<p>\u00d6rne\u011fin, bir <code>Approvable<\/code> (Onaylanabilir) <code>concern<\/code>&#8216;i, onay s\u00fcreci olan t\u00fcm modeller i\u00e7in (\u00fcr\u00fcnler, yorumlar, kullan\u0131c\u0131lar vb.) <code>approve!<\/code>, <code>reject!<\/code>, <code>pending?<\/code> gibi metodlar\u0131, onay tarihi alan\u0131n\u0131 ve ilgili scope&#8217;lar\u0131 i\u00e7erebilir. Benzer \u015fekilde, bir <code>Taggable<\/code> (Etiketlenebilir) <code>concern<\/code>&#8216;i, etiketleme sistemi olan modeller i\u00e7in <code>has_many :tags<\/code>, <code>tag_list<\/code> gibi metodlar\u0131 ve etiket y\u00f6netimi mant\u0131\u011f\u0131n\u0131 bar\u0131nd\u0131rabilir. \u00d6nemli olan, her bir <code>concern<\/code>&#8216;in tek bir, iyi tan\u0131mlanm\u0131\u015f bir sorumlulu\u011fu olmas\u0131d\u0131r. Bu, onlar\u0131n hem yeniden kullan\u0131labilirli\u011fini hem de bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r ve <code>concerns<\/code>&#8216;in bir &#8220;\u00e7\u00f6p kutusu&#8221; olmaktan \u00e7\u0131k\u0131p, de\u011ferli bir mimari bile\u015fen haline gelmesini sa\u011flar.<\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: Bir <code>concern<\/code> olu\u015ftururken &#8220;Bu mod\u00fcl tek bir \u015feyi mi yap\u0131yor?&#8221; sorusunu kendinize sorun. Cevab\u0131n\u0131z &#8220;evet&#8221; ise do\u011fru yoldas\u0131n\u0131z demektir.<\/div>\n<h2><code>concerns\/<\/code> Klas\u00f6r\u00fcn\u00fc Do\u011fru Kullan\u0131m Senaryolar\u0131 Nelerdir?<\/h2>\n<p><code>concerns\/<\/code> klas\u00f6r\u00fcn\u00fcn g\u00fcc\u00fc, ortak davran\u0131\u015flar\u0131 ve mant\u0131\u011f\u0131 mod\u00fcler, yeniden kullan\u0131labilir par\u00e7alara ay\u0131rma yetene\u011finde yatar. Ancak bu g\u00fcc\u00fcn do\u011fru y\u00f6nlendirilmesi, projenin sa\u011fl\u0131\u011f\u0131 i\u00e7in kritik \u00f6neme sahiptir. Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, kod tekrar\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r, model s\u0131n\u0131flar\u0131n\u0131 daha okunabilir ve y\u00f6netilebilir hale getirir ve genel mimariyi g\u00fc\u00e7lendirir. \u0130\u015fte <code>concerns<\/code>&#8216;i etkin bir \u015fekilde kullanabilece\u011finiz baz\u0131 ger\u00e7ek d\u00fcnya senaryolar\u0131 ve ad\u0131m ad\u0131m uygulamal\u0131 \u00f6rnekler.<\/p>\n<h3>Ortak Davran\u0131\u015flar\u0131 Modeller Aras\u0131nda Payla\u015fmak: Bir Vaka Analizi<\/h3>\n<p>Hayal edelim ki bir blog platformu geli\u015ftiriyoruz. Bu platformda hem <code>Post<\/code> (G\u00f6nderi) hem de <code>Comment<\/code> (Yorum) modelleri bulunuyor. Her iki modelin de &#8220;yay\u0131nlanm\u0131\u015f&#8221; veya &#8220;taslak&#8221; durumlar\u0131 var ve her ikisinin de bir yay\u0131nlama\/yay\u0131nlamay\u0131 geri \u00e7ekme mekanizmas\u0131na ihtiyac\u0131 var. Ayr\u0131ca, sadece yay\u0131nlanm\u0131\u015f i\u00e7erikleri getiren bir sorgu scope&#8217;una da gereksinim duyuyoruz. Bu durumda, ayn\u0131 mant\u0131\u011f\u0131 iki farkl\u0131 modele kopyalamak yerine, bir <code>Publishable<\/code> (Yay\u0131nlanabilir) concern&#8217;i olu\u015fturmak olduk\u00e7a mant\u0131kl\u0131 olacakt\u0131r.<\/p>\n<pre><code>\n# app\/models\/concerns\/publishable.rb\nmodule Publishable\n  extend ActiveSupport::Concern\n\n  included do\n    # Bir i\u00e7eri\u011fin varsay\u0131lan olarak taslak olmas\u0131n\u0131 sa\u011flayal\u0131m\n    before_validation :set_draft_status, on: :create\n    \n    # Yay\u0131nlanm\u0131\u015f i\u00e7erikleri getiren scope\n    scope :published, -> { where(status: 'published') }\n    scope :draft, -> { where(status: 'draft') }\n  end\n\n  # Instance metodlar\u0131\n  def publish!\n    update(status: 'published', published_at: Time.current) if draft?\n  end\n\n  def unpublish!\n    update(status: 'draft', published_at: nil) if published?\n  end\n\n  def published?\n    status == 'published'\n  end\n\n  def draft?\n    status == 'draft'\n  end\n\n  private\n\n  def set_draft_status\n    self.status ||= 'draft'\n  end\nend\n\n<\/pre>\n<p><\/code><\/p>\n<pre><code>\n# app\/models\/post.rb\nclass Post < ApplicationRecord\n  include Publishable # Publishable concern'ini dahil ediyoruz\n\n  # Post'a \u00f6zg\u00fc di\u011fer mant\u0131k\n  validates :title, presence: true\n  validates :body, presence: true\nend\n\n<\/pre>\n<p><\/code><\/p>\n<pre><code>\n# app\/models\/comment.rb\nclass Comment < ApplicationRecord\n  include Publishable # Publishable concern'ini dahil ediyoruz\n\n  # Comment'e \u00f6zg\u00fc di\u011fer mant\u0131k\n  belongs_to :post\n  validates :content, presence: true\nend\n\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>Publishable<\/code> concern'i, <code>published?<\/code>, <code>draft?<\/code>, <code>publish!<\/code>, <code>unpublish!<\/code> gibi metodlar\u0131 ve <code>published<\/code> ile <code>draft<\/code> scope'lar\u0131n\u0131 kapsar. Ayr\u0131ca, i\u00e7eri\u011fin varsay\u0131lan olarak taslak olarak ba\u015flamas\u0131n\u0131 sa\u011flayan bir <code>before_validation<\/code> callback'i de i\u00e7erir. Hem <code>Post<\/code> hem de <code>Comment<\/code> modelleri, basit\u00e7e <code>include Publishable<\/code> diyerek bu t\u00fcm davran\u0131\u015flar\u0131 kazan\u0131r. Bu yakla\u015f\u0131m, her modelde ayn\u0131 kodu tekrarlamaktan ka\u00e7\u0131n\u0131r ve i\u015f mant\u0131\u011f\u0131nda bir de\u011fi\u015fiklik oldu\u011funda sadece <code>Publishable<\/code> concern'ini g\u00fcncellemenin yeterli olmas\u0131n\u0131 sa\u011flar. B\u00f6ylece, kod taban\u0131n\u0131n genel tutarl\u0131l\u0131\u011f\u0131 artar ve bak\u0131m\u0131 kolayla\u015f\u0131r.<\/p>\n<h3><code>concerns<\/code> ile Kod Tekrar\u0131n\u0131 Azaltma: Ad\u0131m Ad\u0131m Uygulama<\/h3>\n<p>Bir ba\u015fka yayg\u0131n senaryo, \"soft delete\" (yumu\u015fak silme) \u00f6zelli\u011fidir. Bir\u00e7ok uygulamada, verileri tamamen silmek yerine sadece g\u00f6r\u00fcnmez hale getirmek istenir. Bu, <code>deleted_at<\/code> gibi bir zaman damgas\u0131 alan\u0131 ekleyerek ve bu alan\u0131 g\u00fcncelleyerek yap\u0131labilir. Bu mant\u0131\u011f\u0131 da bir <code>Deletable<\/code> concern'i ile kolayca y\u00f6netebiliriz:<\/p>\n<pre><code>\n# app\/models\/concerns\/deletable.rb\nmodule Deletable\n  extend ActiveSupport::Concern\n\n  included do\n    # Varsay\u0131lan scope: silinmemi\u015f kay\u0131tlar\u0131 getir\n    default_scope { where(deleted_at: nil) }\n\n    # Silinmi\u015f kay\u0131tlar\u0131 getiren scope\n    scope :deleted, -> { unscoped.where.not(deleted_at: nil) }\n  end\n\n  # Instance metodlar\u0131\n  def soft_delete\n    update(deleted_at: Time.current) unless deleted?\n  end\n\n  def restore\n    update(deleted_at: nil) if deleted?\n  end\n\n  def deleted?\n    deleted_at.present?\n  end\nend\n\n<\/pre>\n<p><\/code><\/p>\n<pre><code>\n# app\/models\/product.rb\nclass Product < ApplicationRecord\n  include Deletable # Deletable concern'ini dahil ediyoruz\n\n  # Di\u011fer Product mant\u0131\u011f\u0131\n  validates :name, presence: true\n  validates :price, numericality: { greater_than: 0 }\nend\n\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>Deletable<\/code> concern'i, bir kayd\u0131 \"silmek\" (<code>soft_delete<\/code>), \"geri y\u00fcklemek\" (<code>restore<\/code>) ve \"silinmi\u015f mi\" (<code>deleted?<\/code>) kontrol etmek i\u00e7in gerekli metodlar\u0131 sa\u011flar. Ayr\u0131ca, varsay\u0131lan olarak silinmemi\u015f kay\u0131tlar\u0131 getiren bir <code>default_scope<\/code> ve silinmi\u015f kay\u0131tlar\u0131 filtrelemek i\u00e7in <code>deleted<\/code> scope'unu da i\u00e7erir. Bu sayede, <code>Product.all<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda sadece silinmemi\u015f \u00fcr\u00fcnler gelirken, <code>Product.deleted<\/code> ile silinmi\u015f \u00fcr\u00fcnlere eri\u015filebilir. Bu modelde, <code>deleted_at<\/code> ad\u0131nda bir <code>datetime<\/code> alan\u0131n\u0131n olmas\u0131 gerekti\u011fini unutmamak \u00f6nemlidir. Bu t\u00fcr bir yap\u0131, veritaban\u0131ndan verilerin kal\u0131c\u0131 olarak silinmesini gerektirmeyen i\u015f kurallar\u0131n\u0131 desteklemek i\u00e7in son derece kullan\u0131\u015fl\u0131d\u0131r ve <code>concerns<\/code> klas\u00f6r\u00fcn\u00fcn sa\u011flad\u0131\u011f\u0131 mod\u00fclerlik sayesinde kolayca uygulanabilir. <code>concerns<\/code> sayesinde, hem kod tekrar\u0131n\u0131 azaltm\u0131\u015f oluruz hem de uygulama genelinde tutarl\u0131 bir silme mekanizmas\u0131 sa\u011flam\u0131\u015f oluruz. Bu, b\u00fcy\u00fck projelerde zamanla ortaya \u00e7\u0131kabilecek karma\u015f\u0131kl\u0131\u011f\u0131 y\u00f6netmek i\u00e7in hayati bir ad\u0131md\u0131r.<\/p>\n<h2>Potansiyel Tuzaklar ve Yanl\u0131\u015f Kullan\u0131mlar: <code>concerns<\/code> Klas\u00f6r\u00fc Ne Zaman Bir Dijital \u00c7\u00f6p Kutusuna D\u00f6n\u00fc\u015f\u00fcr?<\/h2>\n<p><code>concerns\/<\/code> klas\u00f6r\u00fcn\u00fcn sa\u011flad\u0131\u011f\u0131 mod\u00fclerlik ve kod tekrar\u0131n\u0131 azaltma avantajlar\u0131 yads\u0131namaz. Ancak, bu g\u00fc\u00e7l\u00fc arac\u0131n yanl\u0131\u015f veya a\u015f\u0131r\u0131 kullan\u0131m\u0131, ba\u015flang\u0131\u00e7taki iyi niyetin tam tersi sonu\u00e7lar do\u011furabilir. <code>concerns<\/code>'ler, kontrols\u00fcz bir \u015fekilde b\u00fcy\u00fcd\u00fcklerinde veya uygunsuz mant\u0131k par\u00e7alar\u0131n\u0131 bar\u0131nd\u0131rd\u0131klar\u0131nda, h\u0131zla bir \"dijital \u00e7\u00f6p kutusu\"na d\u00f6n\u00fc\u015febilirler. Bu durum, kod taban\u0131n\u0131 daha karma\u015f\u0131k, anla\u015f\u0131lmas\u0131 zor ve bak\u0131m\u0131 g\u00fc\u00e7 hale getirebilir. Bu b\u00f6l\u00fcmde, <code>concerns<\/code> klas\u00f6r\u00fcn\u00fcn ne zaman bir sorun kayna\u011f\u0131 haline gelebilece\u011fini ve bu tuzaklardan nas\u0131l ka\u00e7\u0131n\u0131laca\u011f\u0131n\u0131 inceleyece\u011fiz.<\/p>\n<h3><code>concerns<\/code> \u0130\u00e7ine Her \u015eeyi Atmak: Anti-Paternler<\/h3>\n<p>Bir <code>concern<\/code>'in i\u00e7ine neyin girece\u011fi konusunda net s\u0131n\u0131rlar \u00e7izilmedi\u011finde, geli\u015ftiriciler kolayca \"her \u015feyi atma\" al\u0131\u015fkanl\u0131\u011f\u0131na kap\u0131labilirler. Bu, k\u00fc\u00e7\u00fck, alakas\u0131z metodlar\u0131n, hatta ba\u011f\u0131ms\u0131z i\u015f mant\u0131klar\u0131n\u0131n bile <code>concerns<\/code>'lere ta\u015f\u0131nmas\u0131na yol a\u00e7ar. Sonu\u00e7 olarak, tek bir <code>concern<\/code>, asl\u0131nda birden fazla sorumlulu\u011fu \u00fcstlenmi\u015f, tutars\u0131z ve \"ya\u011fl\u0131\" hale gelmi\u015f bir mod\u00fcl olur. \u00d6rne\u011fin, bir <code>User<\/code> modelinde <code>Authenticatable<\/code> (Kimlik Do\u011frulanabilir) concern'i kullan\u0131l\u0131yor olabilir. Ancak bu concern'in i\u00e7ine \u015fifre do\u011frulama, e-posta g\u00f6nderimi, profil g\u00fcncellemeleri ve hatta d\u0131\u015f servislerle entegrasyon gibi alakas\u0131z i\u015flevlerin tamam\u0131n\u0131 koymak, Tek Sorumluluk Prensibi'ni (SRP) ihlal eder. B\u00f6yle bir durumda, concern'in ad\u0131yla i\u00e7erdi\u011fi mant\u0131k aras\u0131nda bir tutars\u0131zl\u0131k olu\u015fur ve bu da kodu okuyanlar i\u00e7in kafa kar\u0131\u015ft\u0131r\u0131c\u0131 olur.<\/p>\n<p>Ayr\u0131ca, bir <code>concern<\/code>'in \u00e7ok fazla ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 oldu\u011funda da sorunlar ba\u015flar. E\u011fer bir <code>concern<\/code>, belirli bir modelin veya kontrolc\u00fcn\u00fcn spesifik yap\u0131s\u0131n\u0131 veya belirli bir veritaban\u0131 \u015femas\u0131n\u0131 varsay\u0131yorsa, bu onun yeniden kullan\u0131labilirli\u011fini s\u0131n\u0131rlar. Herhangi bir de\u011fi\u015fiklik, bu <code>concern<\/code>'i kullanan t\u00fcm s\u0131n\u0131flar\u0131 etkileyebilir ve beklenmedik yan etkilere yol a\u00e7abilir. Bu t\u00fcr \"s\u0131k\u0131ca ba\u011fl\u0131\" (tightly coupled) <code>concerns<\/code>'ler, mod\u00fclerli\u011fi art\u0131rmak yerine, gizli ba\u011f\u0131ml\u0131l\u0131klar yaratarak sistemin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r. Bu durum, yeni \u00f6zellik eklemeyi veya mevcut kodu refactor etmeyi zorla\u015ft\u0131r\u0131r, \u00e7\u00fcnk\u00fc bir yerdeki k\u00fc\u00e7\u00fck bir de\u011fi\u015fiklik bile projenin farkl\u0131 b\u00f6lgelerinde zincirleme hatalara neden olabilir.<\/p>\n<h3><code>concerns<\/code> Y\u0131\u011f\u0131nlar\u0131: Bak\u0131m Kabusu Nas\u0131l Ba\u015flar?<\/h3>\n<p>Bir model s\u0131n\u0131f\u0131n\u0131n i\u00e7ine \u00e7ok say\u0131da <code>concern<\/code> dahil etmek, ilk bak\u0131\u015fta \"temiz\" g\u00f6r\u00fcnebilir \u00e7\u00fcnk\u00fc ana model dosyas\u0131 k\u0131sa kal\u0131r. Ancak, bu durum genellikle altta yatan karma\u015f\u0131kl\u0131\u011f\u0131 gizler ve \"concern y\u0131\u011f\u0131nlar\u0131\" ad\u0131 verilen bir bak\u0131m kabusuna yol a\u00e7abilir. Bir modelin <code>include ConcernA, ConcernB, ConcernC, ConcernD<\/code> \u015feklinde olmas\u0131, o modelin davran\u0131\u015f\u0131n\u0131 anlamak i\u00e7in d\u00f6rt farkl\u0131 dosyaya bakmay\u0131 gerektirir. Her bir concern'in ne yapt\u0131\u011f\u0131n\u0131, hangi metodlar\u0131 sa\u011flad\u0131\u011f\u0131n\u0131 ve hangi ba\u011f\u0131ml\u0131l\u0131klar\u0131 oldu\u011funu kavramak zaman al\u0131c\u0131 hale gelir. \u00d6zellikle bu <code>concerns<\/code>'ler birbiriyle etkile\u015fime giriyorsa veya metod ad\u0131 \u00e7ak\u0131\u015fmalar\u0131 (method name collisions) ya\u015fan\u0131yorsa, hata ay\u0131klama ve sorun giderme s\u00fcreci olduk\u00e7a zorla\u015f\u0131r.<\/p>\n<p>Bir <code>concern<\/code>'in i\u00e7indeki mant\u0131\u011f\u0131n zamanla de\u011fi\u015fmesi veya geni\u015flemesi de cabas\u0131d\u0131r. E\u011fer bir <code>concern<\/code> ba\u015flang\u0131\u00e7ta k\u00fc\u00e7\u00fck ve odaklanm\u0131\u015f olsa bile, yeni \u00f6zellikler eklendik\u00e7e veya mevcut mant\u0131k geni\u015fletildik\u00e7e, \"biraz daha ekleyelim\" mant\u0131\u011f\u0131yla b\u00fcy\u00fcyebilir. Bu da <code>concerns<\/code>'lerin kendi ba\u015flar\u0131na birer \"ya\u011fl\u0131 mod\u00fcl\" haline gelmesine neden olur. Bir <code>concern<\/code> ne kadar \u00e7ok metod, callback veya ili\u015fki i\u00e7erirse, o kadar az genel ama\u00e7l\u0131 olur ve yeniden kullan\u0131labilirlik de\u011feri d\u00fc\u015fer. Bu durum, kodun esnekli\u011fini azalt\u0131r ve gelecekteki de\u011fi\u015fikliklere diren\u00e7 g\u00f6sterir. Bu y\u00fczden, <code>concerns<\/code> kullan\u0131m\u0131nda disiplinli olmak ve her bir <code>concern<\/code>'in amac\u0131n\u0131 ve kapsam\u0131n\u0131 net bir \u015fekilde tan\u0131mlamak, potansiyel tuzaklardan ka\u00e7\u0131nmak ve <code>concerns<\/code>'i ger\u00e7ekten bir mimari d\u00fczenleyici olarak kullanabilmek i\u00e7in elzemdir.<\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: Bir modelde 3'ten fazla <code>concern<\/code> g\u00f6rd\u00fc\u011f\u00fcn\u00fczde durup d\u00fc\u015f\u00fcn\u00fcn. Belki de modeliniz hala \u00e7ok fazla sorumlulu\u011fa sahip veya <code>concerns<\/code>'leriniz \u00e7ok geni\u015f kapsaml\u0131d\u0131r.<\/div>\n<h2>En \u0130yi Pratikler ve Tasar\u0131m \u0130lkeleri: <code>concerns<\/code> Klas\u00f6r\u00fcn\u00fc Etkin Bir Mimari Bile\u015fen Olarak Nas\u0131l Y\u00f6netiriz?<\/h2>\n<p><code>concerns\/<\/code> klas\u00f6r\u00fcn\u00fcn dijital bir \u00e7\u00f6p kutusuna d\u00f6n\u00fc\u015fmesini engellemek ve onu ger\u00e7ekten de\u011ferli bir mimari bile\u015fen olarak kullanmak i\u00e7in belirli tasar\u0131m ilkelerine ve en iyi pratiklere uymak gerekir. Bu pratikler, <code>concerns<\/code>'lerinizi k\u00fc\u00e7\u00fck, odaklanm\u0131\u015f ve y\u00f6netilebilir tutman\u0131za yard\u0131mc\u0131 olurken, ayn\u0131 zamanda kod taban\u0131n\u0131z\u0131n genel sa\u011fl\u0131\u011f\u0131n\u0131 ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131r\u0131r. Disiplinli bir yakla\u015f\u0131m benimseyerek, <code>concerns<\/code>'lerin karma\u015f\u0131kl\u0131\u011f\u0131 azaltan, kod tekrar\u0131n\u0131 \u00f6nleyen ve anla\u015f\u0131l\u0131rl\u0131\u011f\u0131 art\u0131ran ara\u00e7lar olarak kalmas\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<h3><code>concerns<\/code> \u0130\u00e7in S\u0131n\u0131rlar Belirlemek: Ne Kadar K\u00fc\u00e7\u00fck Olmal\u0131lar?<\/h3>\n<p>Bir <code>concern<\/code>'in ideal b\u00fcy\u00fckl\u00fc\u011f\u00fc ve kapsam\u0131, genellikle onun tek bir sorumlulu\u011fu \u00fcstlenmesiyle \u00f6l\u00e7\u00fcl\u00fcr. Bu, Tek Sorumluluk Prensibi (SRP) olarak bilinir: bir mod\u00fcl\u00fcn veya s\u0131n\u0131f\u0131n (bu durumda bir <code>concern<\/code>'in) sadece bir \u015feyi yapmas\u0131 ve sadece bir nedenle de\u011fi\u015fmesi gerekir. E\u011fer bir <code>concern<\/code>'i tan\u0131mlarken birden fazla kavram\u0131 veya i\u015flevselli\u011fi bir araya getirdi\u011finizi fark ediyorsan\u0131z, bu, onu daha k\u00fc\u00e7\u00fck, daha odaklanm\u0131\u015f <code>concerns<\/code>'lere b\u00f6lmeniz gerekti\u011finin bir i\u015faretidir. \u00d6rne\u011fin, <code>Authenticatable<\/code> ve <code>Authorizable<\/code> gibi iki ayr\u0131 <code>concern<\/code>, kullan\u0131c\u0131 y\u00f6netimiyle ilgili bir\u00e7ok farkl\u0131 mant\u0131\u011f\u0131 bar\u0131nd\u0131ran tek bir <code>UserManagement<\/code> concern'inden \u00e7ok daha iyidir.<\/p>\n<p>K\u00fc\u00e7\u00fck <code>concerns<\/code>'ler, daha kolay anla\u015f\u0131l\u0131r, test edilebilir ve yeniden kullan\u0131labilirdir. Bir <code>concern<\/code> sadece birka\u00e7 metod, bir veya iki callback ve belki birka\u00e7 scope i\u00e7eriyorsa, bu ideal bir durumdur. Bu, di\u011fer geli\u015ftiricilerin mod\u00fcl\u00fcn amac\u0131n\u0131 h\u0131zla kavramas\u0131na yard\u0131mc\u0131 olur ve olas\u0131 yan etkileri minimize eder. Ayr\u0131ca, bir <code>concern<\/code>'in ad\u0131n\u0131 da \u00f6zenle se\u00e7mek \u00f6nemlidir. Ad, mod\u00fcl\u00fcn ne yapt\u0131\u011f\u0131n\u0131 a\u00e7\u0131k\u00e7a yans\u0131tmal\u0131 ve yan\u0131lt\u0131c\u0131 olmamal\u0131d\u0131r. \u00d6rne\u011fin, <code>Taggable<\/code> (Etiketlenebilir) bir concern, etiketleme ile ilgili t\u00fcm mant\u0131\u011f\u0131 i\u00e7ermelidir; ba\u015fka bir \u015fey de\u011fil. Bu s\u0131n\u0131rlar, <code>concerns<\/code>'lerinizi bir \"\u00e7\u00f6p kutusu\" olmaktan \u00e7\u0131kar\u0131p, belirli bir amaca hizmet eden de\u011ferli mimari par\u00e7alar haline getirecektir.<\/p>\n<h3><code>concerns<\/code> Kullan\u0131m\u0131nda Test Otomasyonu Neden Kritik?<\/h3>\n<p>Her yaz\u0131l\u0131m bile\u015feninde oldu\u011fu gibi, <code>concerns<\/code>'ler i\u00e7in de kapsaml\u0131 test otomasyonu hayati \u00f6neme sahiptir. <code>concerns<\/code>'ler, uygulamada farkl\u0131 yerlerde yeniden kullan\u0131ld\u0131klar\u0131 i\u00e7in, bir <code>concern<\/code>'deki bir hata, onu kullanan t\u00fcm s\u0131n\u0131flar\u0131 etkileyebilir. Bu nedenle, her bir <code>concern<\/code>'in kendi ba\u015f\u0131na do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak, genel sistemin g\u00fcvenilirli\u011fini sa\u011flamak i\u00e7in kritik bir ad\u0131md\u0131r. Bir <code>concern<\/code>'i, onu kullanan bir modelle birlikte test etmek yerine, kendi ba\u015f\u0131na izole bir \u015fekilde test edebilmek idealdir.<\/p>\n<p>\u00d6rne\u011fin, bir <code>Publishable<\/code> concern'i i\u00e7in, <code>publish!<\/code>, <code>unpublish!<\/code>, <code>published?<\/code> ve <code>draft?<\/code> metodlar\u0131n\u0131n beklenen \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve <code>published<\/code> scope'unun do\u011fru kay\u0131tlar\u0131 d\u00f6nd\u00fcrd\u00fc\u011f\u00fcn\u00fc do\u011frulamak \u00f6nemlidir. Bu testler, concern'in ba\u011f\u0131ms\u0131z olarak do\u011fru davrand\u0131\u011f\u0131n\u0131 garanti eder. Ayr\u0131ca, bir <code>concern<\/code>'i kullanan bir modelde test yazarken, modelin kendi \u00f6zg\u00fc mant\u0131\u011f\u0131na odaklan\u0131lmal\u0131, concern'in zaten test edilmi\u015f i\u015flevselli\u011fi yeniden test edilmemelidir. Bu yakla\u015f\u0131m, test s\u00fcresini k\u0131salt\u0131r ve testlerin daha odaklanm\u0131\u015f olmas\u0131n\u0131 sa\u011flar. G\u00fc\u00e7l\u00fc bir test paketi, <code>concerns<\/code>'lerde yap\u0131lan de\u011fi\u015fikliklerin g\u00fcvenle da\u011f\u0131t\u0131labilmesini sa\u011flar ve beklenmedik regresyonlar\u0131 \u00f6nler, bu da uzun vadede projenin bak\u0131m\u0131n\u0131 \u00e7ok daha kolay hale getirir.<\/p>\n<pre><code>\n# Concern i\u00e7in \u00f6rnek test (RSpec stili)\n# spec\/concerns\/publishable_spec.rb\nrequire 'rails_helper'\n\nRSpec.describe Publishable, type: :concern do\n  # Test i\u00e7in ge\u00e7ici bir model olu\u015fturuyoruz\n  let(:model_class) do\n    Class.new do\n      include ActiveModel::Model\n      include ActiveModel::Attributes\n      include ActiveModel::Validations\n      include Publishable # Concern'i dahil ediyoruz\n\n      attribute :status, :string\n      attribute :published_at, :datetime\n\n      # Test i\u00e7in gerekli di\u011fer metodlar\u0131 tan\u0131mlayabiliriz\n      def update(attributes)\n        attributes.each do |key, value|\n          send(\"#{key}=\", value)\n        end\n        true # Ba\u015far\u0131l\u0131 update oldu\u011funu varsayal\u0131m\n      end\n\n      def self.where(conditions)\n        # Basit bir filtreleme mekanizmas\u0131\n        [ OpenStruct.new(status: 'published'), OpenStruct.new(status: 'draft') ].select do |record|\n          conditions.all? { |k, v| record.send(k) == v }\n        end\n      end\n\n      # Callbacks i\u00e7in basit bir mock\n      def self.before_validation(*args); end\n      def self.scope(*args); end\n    end\n  end\n\n  subject { model_class.new(status: 'draft') }\n\n  it 'ba\u015flang\u0131\u00e7ta taslak durumundad\u0131r' do\n    expect(subject).to be_draft\n    expect(subject).not_to be_published\n  end\n\n  it '#publish! metodunu \u00e7a\u011f\u0131r\u0131nca yay\u0131nlan\u0131r' do\n    subject.publish!\n    expect(subject).to be_published\n    expect(subject.published_at).to be_present\n  end\n\n  it '#unpublish! metodunu \u00e7a\u011f\u0131r\u0131nca taslak olur' do\n    subject.status = 'published'\n    subject.unpublish!\n    expect(subject).to be_draft\n    expect(subject.published_at).to be_nil\n  end\n\n  it '.published scope ile yay\u0131nlanm\u0131\u015flar\u0131 getirir' do\n    published_records = model_class.published\n    expect(published_records.size).to eq(1)\n    expect(published_records.first.status).to eq('published')\n  end\nend\n\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki test \u00f6rne\u011fi, bir concern'in Rails ortam\u0131ndan ba\u011f\u0131ms\u0131z olarak nas\u0131l test edilebilece\u011fini g\u00f6sterir. Bu, concern'in ta\u015f\u0131nabilirli\u011fini ve ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<h2>\u0130leri D\u00fczey \u0130pu\u00e7lar\u0131 ve Alternatif Yakla\u015f\u0131mlar: <code>concerns<\/code> Mekanizmas\u0131n\u0131 Daha Fazla \u0130yile\u015ftirebilir Miyiz?<\/h2>\n<p><code>concerns<\/code> klas\u00f6r\u00fc, ortak mant\u0131\u011f\u0131 y\u00f6netmede etkili bir ara\u00e7 olsa da, her durum i\u00e7in tek ve en iyi \u00e7\u00f6z\u00fcm de\u011fildir. Yaz\u0131l\u0131m mimarisinde her zaman alternatif yakla\u015f\u0131mlar\u0131 de\u011ferlendirmek ve ba\u011flama en uygun olan\u0131 se\u00e7mek \u00f6nemlidir. Bu b\u00f6l\u00fcmde, <code>concerns<\/code> kullan\u0131m\u0131n\u0131 daha da iyile\u015ftirecek ileri d\u00fczey ipu\u00e7lar\u0131n\u0131 ve <code>concerns<\/code>'lerin yeterli olmad\u0131\u011f\u0131 durumlar i\u00e7in alternatif tasar\u0131m desenlerini inceleyece\u011fiz. Ayr\u0131ca, modern web geli\u015ftirmede, iyi yap\u0131land\u0131r\u0131lm\u0131\u015f backend mant\u0131\u011f\u0131n\u0131n kullan\u0131c\u0131 deneyimiyle nas\u0131l birle\u015fti\u011fine dair genel bir bak\u0131\u015f sunarak, medya sorgular\u0131 gibi mobil uyumluluk prensiplerine de de\u011finece\u011fiz.<\/p>\n<h3><code>concerns<\/code> D\u0131\u015f\u0131nda Ortak Mant\u0131\u011f\u0131 Y\u00f6netme Yollar\u0131<\/h3>\n<p>Bazen bir <code>concern<\/code>, \u00f6zellikle de i\u015f mant\u0131\u011f\u0131 karma\u015f\u0131kla\u015fmaya ba\u015flad\u0131\u011f\u0131nda veya veritaban\u0131 etkile\u015fimlerinin \u00f6tesine ge\u00e7ti\u011finde, yetersiz kalabilir. Bu durumlarda, daha g\u00fc\u00e7l\u00fc tasar\u0131m desenleri ve organizasyonel yap\u0131lar devreye girer:<\/p>\n<ul>\n<li>\n        <strong>Servis Nesneleri (Service Objects):<\/strong> Karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131n\u0131 veya birden fazla model \u00fczerinde i\u015flem yapan mant\u0131klar\u0131 y\u00f6netmek i\u00e7in idealdir. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n kayd\u0131n\u0131 veya bir sipari\u015fin tamamlanmas\u0131n\u0131 sa\u011flayan bir i\u015flem, bir servis nesnesi i\u00e7inde izole edilebilir. Bu nesneler, tek bir genel sorumluluktan ziyade, belirli bir i\u015f operasyonunu ger\u00e7ekle\u015ftirmeye odaklan\u0131r.<\/p>\n<pre><code>\n# app\/services\/user_registration_service.rb\nclass UserRegistrationService\n  def initialize(params)\n    @user_params = params[:user]\n  end\n\n  def call\n    user = User.new(@user_params)\n    if user.save\n      send_welcome_email(user)\n      { success: true, user: user }\n    else\n      { success: false, errors: user.errors }\n    end\n  end\n\n  private\n\n  def send_welcome_email(user)\n    # E-posta g\u00f6nderme mant\u0131\u011f\u0131\n    puts \"Welcome email sent to #{user.email}\"\n  end\nend\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n        <strong>Form Nesneleri (Form Objects):<\/strong> Birden fazla modelden veri toplayan veya standart ActiveRecord validasyonlar\u0131 d\u0131\u015f\u0131nda karma\u015f\u0131k validasyon kurallar\u0131 gerektiren durumlar i\u00e7in kullan\u0131l\u0131r. Bu, \u00f6zellikle nested form'lar veya tek bir form \u00fczerinden birden fazla kayna\u011f\u0131 g\u00fcncelleyen senaryolarda \u00e7ok faydal\u0131d\u0131r.\n    <\/li>\n<li>\n        <strong>View Modelleri\/Sunum Nesneleri (View Models\/Presenters):<\/strong> View katman\u0131nda g\u00f6sterilecek verileri haz\u0131rlamak ve view logic'ini kontrolc\u00fclerden veya modellerden ay\u0131rmak i\u00e7in kullan\u0131l\u0131r. Bu, view'lerin daha temiz ve okunakl\u0131 olmas\u0131n\u0131 sa\u011flar.\n    <\/li>\n<li>\n        <strong>Policies Nesneleri:<\/strong> Yetkilendirme mant\u0131\u011f\u0131n\u0131 merkezi bir yerde tutmak i\u00e7in kullan\u0131l\u0131r. <code>User<\/code>'\u0131n <code>Post<\/code>'u d\u00fczenleme yetkisinin olup olmad\u0131\u011f\u0131n\u0131 kontrol eden bir <code>PostPolicy<\/code> \u00f6rne\u011fi, bu t\u00fcr bir yakla\u015f\u0131m\u0131n g\u00fczel bir \u00f6rne\u011fidir.\n    <\/li>\n<\/ul>\n<p>Bu alternatifler, <code>concerns<\/code>'lerin aksine, genellikle s\u0131n\u0131f tabanl\u0131 kompozisyonu veya daha spesifik sorumluluklar\u0131 vurgular. <code>concerns<\/code>'ler \"davran\u0131\u015flar\u0131 kar\u0131\u015ft\u0131rmak\" (mixin) i\u00e7in harikayken, servis nesneleri \"i\u015flemleri koordine etmek\", form nesneleri \"giri\u015fleri y\u00f6netmek\" ve presenter'lar \"sunumu haz\u0131rlamak\" i\u00e7in daha uygundur.<\/p>\n<h3>Modern Web Geli\u015ftirmede <code>concerns<\/code> ve Kullan\u0131c\u0131 Deneyimi Ba\u011flant\u0131s\u0131 (Media Query \u00d6rne\u011fi)<\/h3>\n<p>Backend'deki temiz ve mod\u00fcler bir mimari, do\u011frudan frontend'deki kullan\u0131c\u0131 deneyimini etkilemez gibi g\u00f6r\u00fcnse de, asl\u0131nda dolayl\u0131 yoldan g\u00fc\u00e7l\u00fc bir ba\u011flant\u0131s\u0131 vard\u0131r. \u0130yi tasarlanm\u0131\u015f <code>concerns<\/code>'ler arac\u0131l\u0131\u011f\u0131yla sunulan tutarl\u0131 ve tahmin edilebilir API'ler veya veri yap\u0131lar\u0131, frontend geli\u015ftiricilerinin daha h\u0131zl\u0131 ve hatas\u0131z UI bile\u015fenleri olu\u015fturmas\u0131na olanak tan\u0131r. \u00d6rne\u011fin, bir <code>Publishable<\/code> concern'i taraf\u0131ndan sa\u011flanan <code>published?<\/code> metodu, frontend'de bir i\u00e7eri\u011fin yay\u0131nlan\u0131p yay\u0131nlanmad\u0131\u011f\u0131na dair g\u00f6stergeyi kolayca render etmeyi sa\u011flar.<\/p>\n<p>Modern web geli\u015ftirmede kullan\u0131c\u0131 deneyiminin (UX) \u00f6nemli bir par\u00e7as\u0131 da mobil uyumluluktur. Responsive (duyarl\u0131) tasar\u0131m, web sitelerinin ve uygulamalar\u0131n\u0131n farkl\u0131 ekran boyutlar\u0131na ve cihazlara uyum sa\u011flamas\u0131n\u0131 gerektirir. Bu uyumluluk, genellikle CSS medya sorgular\u0131 (media queries) kullan\u0131larak sa\u011flan\u0131r. Medya sorgular\u0131, belirli ekran \u00f6zelliklerine (geni\u015flik, y\u00fckseklik, y\u00f6nlendirme vb.) g\u00f6re farkl\u0131 stil kurallar\u0131n\u0131n uygulanmas\u0131na izin verir. Bu, backend'deki <code>concerns<\/code> yap\u0131s\u0131yla do\u011frudan ilgili olmasa da, bir projenin genel kalitesini ve kullan\u0131c\u0131ya sundu\u011fu deneyimi g\u00f6steren \u00f6nemli bir frontend best practice'idir.<\/p>\n<pre><code>\n\/* styles.css dosyas\u0131 *\/\n\n\/* Varsay\u0131lan stil: Geni\u015f ekranlar i\u00e7in *\/\n.container {\n  max-width: 1200px;\n  margin: 0 auto;\n  padding: 20px;\n  display: grid;\n  grid-template-columns: 1fr 300px; \/* Ana i\u00e7erik + yan men\u00fc *\/\n  gap: 30px;\n}\n\n.main-content {\n  background-color: #f9f9f9;\n  padding: 25px;\n  border-radius: 8px;\n}\n\n.sidebar {\n  background-color: #e9e9e9;\n  padding: 25px;\n  border-radius: 8px;\n}\n\n\/* Mobil cihazlar i\u00e7in medya sorgusu (geni\u015flik 768px ve alt\u0131) *\/\n@media screen and (max-width: 768px) {\n  .container {\n    grid-template-columns: 1fr; \/* Tek s\u00fctunlu d\u00fczen *\/\n    padding: 15px;\n  }\n\n  .sidebar {\n    order: -1; \/* Yan men\u00fcy\u00fc ana i\u00e7eri\u011fin \u00fcst\u00fcne ta\u015f\u0131 *\/\n    margin-bottom: 20px;\n  }\n\n  h2 {\n    font-size: 1.8em;\n  }\n\n  p {\n    font-size: 0.9em;\n  }\n}\n\n\/* Daha k\u00fc\u00e7\u00fck mobil cihazlar i\u00e7in medya sorgusu (geni\u015flik 480px ve alt\u0131) *\/\n@media screen and (max-width: 480px) {\n  .container {\n    padding: 10px;\n  }\n\n  .main-content, .sidebar {\n    padding: 15px;\n  }\n\n  h2 {\n    font-size: 1.5em;\n  }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki CSS kodu, farkl\u0131 ekran boyutlar\u0131na g\u00f6re bir sayfan\u0131n d\u00fczenini ve metin boyutlar\u0131n\u0131 nas\u0131l de\u011fi\u015ftirebilece\u011fimizi g\u00f6sterir. B\u00fcy\u00fck ekranlarda iki s\u00fctunlu bir d\u00fczen (<code>main-content<\/code> ve <code>sidebar<\/code>) varken, daha k\u00fc\u00e7\u00fck ekranlarda tek s\u00fctuna ge\u00e7er ve yan men\u00fcy\u00fc ana i\u00e7eri\u011fin \u00fczerine ta\u015f\u0131r\u0131z. Bu t\u00fcr frontend optimizasyonlar\u0131, backend'de g\u00fc\u00e7l\u00fc ve temiz bir mimariyle beslendi\u011finde, kullan\u0131c\u0131ya kesintisiz ve keyifli bir deneyim sunar. <code>concerns<\/code>'ler bu genel resmin sadece bir par\u00e7as\u0131d\u0131r; ancak iyi kullan\u0131ld\u0131klar\u0131nda, kod taban\u0131n\u0131n genel kalitesine katk\u0131da bulunarak, di\u011fer t\u00fcm geli\u015ftirme s\u00fcre\u00e7lerinin de daha verimli ilerlemesine zemin haz\u0131rlarlar.<\/p>\n<h2>Sonu\u00e7: <code>concerns\/<\/code> Klas\u00f6r\u00fc: Bir Sanat Eseri mi, Yoksa K\u00f6t\u00fc Bir Al\u0131\u015fkanl\u0131k m\u0131?<\/h2>\n<p><code>concerns\/<\/code> klas\u00f6r\u00fc, yaz\u0131l\u0131m mimarisi ba\u011flam\u0131nda hem bir f\u0131rsat hem de bir risk bar\u0131nd\u0131ran \u00e7ift y\u00fczl\u00fc bir ara\u00e7t\u0131r. Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, mod\u00fclerli\u011fi te\u015fvik eder, kod tekrar\u0131n\u0131 azalt\u0131r, s\u0131n\u0131flar\u0131 daha k\u00fc\u00e7\u00fck ve okunabilir hale getirir. Ortak davran\u0131\u015flar\u0131 merkezi bir noktada toplayarak, bak\u0131m maliyetlerini d\u00fc\u015f\u00fcr\u00fcr ve yeni \u00f6zelliklerin daha h\u0131zl\u0131 entegre edilmesini sa\u011flar. Bu y\u00f6nleriyle, ger\u00e7ekten de bir mimari d\u00fczenleyici, hatta iyi tasarlanm\u0131\u015f bir sanat eseri olabilir.<\/p>\n<p>Ancak, disiplinsiz veya a\u015f\u0131r\u0131 kullan\u0131ld\u0131\u011f\u0131nda, h\u0131zla bir \"dijital \u00e7\u00f6p kutusu\"na d\u00f6n\u00fc\u015febilir. A\u015f\u0131r\u0131 \u015fi\u015fkin <code>concerns<\/code>'ler, gizli ba\u011f\u0131ml\u0131l\u0131klar, metod ad\u0131 \u00e7ak\u0131\u015fmalar\u0131 ve anlams\u0131z gruplamalar, ba\u015flang\u0131\u00e7taki iyi niyetin tam tersi sonu\u00e7lar do\u011furur. Kodun anla\u015f\u0131labilirli\u011fini azalt\u0131r, hata ay\u0131klamay\u0131 zorla\u015ft\u0131r\u0131r ve uzun vadede bak\u0131m\u0131 kabusa \u00e7evirir. Bu nedenle, <code>concerns<\/code> kullan\u0131rken, her zaman \"bu mod\u00fcl ger\u00e7ekten tek bir sorumlulu\u011fa m\u0131 sahip?\", \"yeniden kullan\u0131labilirli\u011fi art\u0131r\u0131yor mu?\", ve \"modeli daha basit hale getiriyor mu?\" gibi sorular\u0131 sormak kritiktir.<\/p>\n<p>\u00d6zetle, <code>concerns<\/code> klas\u00f6r\u00fc kendi ba\u015f\u0131na ne k\u00f6t\u00fc ne de iyidir. Onun de\u011feri, onu nas\u0131l kulland\u0131\u011f\u0131m\u0131za ba\u011fl\u0131d\u0131r. En iyi pratikleri uygulayarak, s\u0131n\u0131rlar belirleyerek, test otomasyonuna \u00f6nem vererek ve alternatif mimari desenlerini ne zaman se\u00e7ece\u011fimizi bilerek, <code>concerns<\/code>'leri projenizin mimarisini g\u00fc\u00e7lendiren de\u011ferli bir bile\u015fen haline getirebilirsiniz. Unutmay\u0131n, her g\u00fc\u00e7l\u00fc ara\u00e7 gibi, <code>concerns<\/code> de ustal\u0131kla kullan\u0131lmay\u0131 gerektirir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ol>\n<li>\n        <strong><code>concerns<\/code> ne zaman kullan\u0131lmal\u0131?<\/strong><\/p>\n<p><code>concerns<\/code>'ler, birden fazla model, kontrolc\u00fc veya ba\u015fka bir s\u0131n\u0131f aras\u0131nda payla\u015f\u0131lan, belirli bir tek sorumlulu\u011fa sahip davran\u0131\u015flar\u0131 (metodlar, callback'ler, scope'lar, validasyonlar) izole etmek ve kod tekrar\u0131n\u0131 \u00f6nlemek istedi\u011finizde kullan\u0131lmal\u0131d\u0131r. \u00d6rne\u011fin, \"yay\u0131nlanabilirlik\", \"yorum yap\u0131labilirlik\" veya \"yumu\u015fak silme\" gibi \u00f6zellikler i\u00e7in idealdirler.<\/p>\n<\/li>\n<li>\n        <strong><code>concerns<\/code> ve Servis Nesneleri aras\u0131ndaki fark nedir?<\/strong><\/p>\n<p><code>concerns<\/code>'ler, mevcut s\u0131n\u0131flara (\u00f6rne\u011fin Active Record modelleri) davran\u0131\u015flar\u0131 \"kar\u0131\u015ft\u0131rmak\" (mixin) i\u00e7in kullan\u0131l\u0131r ve genellikle s\u0131n\u0131f\u0131n zaten sahip oldu\u011fu sorumluluklara ek \u00f6zellikler katar. Servis Nesneleri ise, genellikle birden fazla model \u00fczerinde i\u015flem yapan veya karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131n\u0131 i\u00e7eren spesifik bir i\u015f operasyonunu ger\u00e7ekle\u015ftirmek i\u00e7in kullan\u0131l\u0131rlar. Bir servis nesnesi genellikle bir s\u0131n\u0131f\u0131n davran\u0131\u015f\u0131n\u0131 geni\u015fletmez, belirli bir g\u00f6revi yerine getirir.<\/p>\n<\/li>\n<li>\n        <strong>Bir <code>concern<\/code> ne kadar b\u00fcy\u00fck olmal\u0131?<\/strong><\/p>\n<p>\u0130deal bir <code>concern<\/code>, Tek Sorumluluk Prensibi'ne (SRP) uygun olarak, tek bir iyi tan\u0131mlanm\u0131\u015f sorumlulu\u011fu \u00fcstlenmelidir. Bu, genellikle concern'in k\u00fc\u00e7\u00fck kalmas\u0131 ve sadece birka\u00e7 metod, callback veya scope i\u00e7ermesi anlam\u0131na gelir. Bir <code>concern<\/code>'in i\u00e7ine \u00e7ok fazla mant\u0131k koymak veya birden fazla sorumlulu\u011fu birle\u015ftirmek, onu \"ya\u011fl\u0131 mod\u00fcl\" haline getirerek y\u00f6netimi zorla\u015ft\u0131r\u0131r.<\/p>\n<\/li>\n<li>\n        <strong><code>concerns<\/code> kullan\u0131m\u0131n\u0131n dezavantajlar\u0131 nelerdir?<\/strong><\/p>\n<p>Yanl\u0131\u015f kullan\u0131ld\u0131\u011f\u0131nda, <code>concerns<\/code>'ler kod taban\u0131n\u0131 daha karma\u015f\u0131k hale getirebilir. A\u015f\u0131r\u0131 kullan\u0131m, \"concern y\u0131\u011f\u0131nlar\u0131na\" yol a\u00e7arak bir s\u0131n\u0131f\u0131n davran\u0131\u015f\u0131n\u0131 anlamay\u0131 zorla\u015ft\u0131r\u0131r, gizli ba\u011f\u0131ml\u0131l\u0131klar yaratabilir ve metod ad\u0131 \u00e7ak\u0131\u015fmalar\u0131na neden olabilir. Ayr\u0131ca, <code>concerns<\/code>'ler a\u015f\u0131r\u0131 b\u00fcy\u00fcd\u00fc\u011f\u00fcnde veya s\u0131k\u0131ca ba\u011fland\u0131\u011f\u0131nda yeniden kullan\u0131labilirlikleri azal\u0131r ve bak\u0131mlar\u0131 zorla\u015f\u0131r.<\/p>\n<\/li>\n<li>\n        <strong>Frontend'deki mobil uyumlulukla <code>concerns<\/code>'in nas\u0131l bir ba\u011flant\u0131s\u0131 var?<\/strong><\/p>\n<p>Do\u011frudan bir ba\u011flant\u0131 olmasa da, backend'deki temiz ve mod\u00fcler bir mimari (<code>concerns<\/code> gibi yap\u0131larla desteklenen), frontend'in daha tutarl\u0131 ve g\u00fcvenilir veri kaynaklar\u0131na eri\u015fmesini sa\u011flar. Bu, frontend geli\u015ftiricilerinin daha h\u0131zl\u0131 ve hatas\u0131z kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmas\u0131na yard\u0131mc\u0131 olur. Mobil uyumluluk ise (\u00f6rne\u011fin medya sorgular\u0131 ile), frontend'in farkl\u0131 cihazlarda iyi g\u00f6r\u00fcnmesini sa\u011flayan ayr\u0131 bir geli\u015ftirme prati\u011fidir, ancak genel bir projenin kalitesini ve kullan\u0131c\u0131 deneyimini tamamlayan \u00f6nemli bir unsurdur.<\/p>\n<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, \u00f6zellikle Ruby on Rails gibi modern framework&#8217;lerde s\u0131k\u00e7a kar\u015f\u0131m\u0131za \u00e7\u0131kan concerns\/ klas\u00f6r\u00fc, kimi zaman bir&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-32458","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>concerns\/ Klas\u00f6r\u00fc: Mimari D\u00fczenleyici mi, Dijital \u00c7\u00f6p Kutusu mu?<\/title>\n<meta name=\"description\" content=\"Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, \u00f6zellikle Ruby on Rails gibi modern framework&#039;lerde s\u0131k\u00e7a kar\u015f\u0131m\u0131za \u00e7\u0131kan concerns\/ klas\u00f6r\u00fc, kimi zaman bir kurtar\u0131c\u0131, kimi zaman ise bir karma\u015fa kayna\u011f\u0131 olabilir. Peki, bu dizin ger\u00e7ekten de kod taban\u0131n\u0131z\u0131 d\u00fczenleyen bir mimari harikas\u0131 m\u0131, yoksa kontrols\u00fcz b\u00fcy\u00fcyen bir &quot;dijital \u00e7\u00f6p kutusu&quot; mu? Bu makale, concerns klas\u00f6r\u00fcn\u00fcn derinliklerine inerek hem faydalar\u0131n\u0131 hem de olas\u0131 tuzaklar\u0131n\u0131 ayd\u0131nlat\u0131yor, do\u011fru kullan\u0131m senaryolar\u0131n\u0131 ve en iyi pratikleri ad\u0131m ad\u0131m inceliyor.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"concerns\/ Klas\u00f6r\u00fc: Mimari D\u00fczenleyici mi, Dijital \u00c7\u00f6p Kutusu mu?\" \/>\n<meta property=\"og:description\" content=\"Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, \u00f6zellikle Ruby on Rails gibi modern framework&#039;lerde s\u0131k\u00e7a kar\u015f\u0131m\u0131za \u00e7\u0131kan concerns\/ klas\u00f6r\u00fc, kimi zaman bir kurtar\u0131c\u0131, kimi zaman ise bir karma\u015fa kayna\u011f\u0131 olabilir. Peki, bu dizin ger\u00e7ekten de kod taban\u0131n\u0131z\u0131 d\u00fczenleyen bir mimari harikas\u0131 m\u0131, yoksa kontrols\u00fcz b\u00fcy\u00fcyen bir &quot;dijital \u00e7\u00f6p kutusu&quot; mu? Bu makale, concerns klas\u00f6r\u00fcn\u00fcn derinliklerine inerek hem faydalar\u0131n\u0131 hem de olas\u0131 tuzaklar\u0131n\u0131 ayd\u0131nlat\u0131yor, do\u011fru kullan\u0131m senaryolar\u0131n\u0131 ve en iyi pratikleri ad\u0131m ad\u0131m inceliyor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-21T23:31:17+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"27 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"concerns\/ Klas\u00f6r\u00fc: Mimari D\u00fczenleyici mi, Dijital \u00c7\u00f6p Kutusu mu?\",\"datePublished\":\"2025-10-21T23:31:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/\"},\"wordCount\":4556,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/\",\"name\":\"concerns\/ Klas\u00f6r\u00fc: Mimari D\u00fczenleyici mi, Dijital \u00c7\u00f6p Kutusu mu?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-21T23:31:17+00:00\",\"description\":\"Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, \u00f6zellikle Ruby on Rails gibi modern framework'lerde s\u0131k\u00e7a kar\u015f\u0131m\u0131za \u00e7\u0131kan concerns\/ klas\u00f6r\u00fc, kimi zaman bir kurtar\u0131c\u0131, kimi zaman ise bir karma\u015fa kayna\u011f\u0131 olabilir. Peki, bu dizin ger\u00e7ekten de kod taban\u0131n\u0131z\u0131 d\u00fczenleyen bir mimari harikas\u0131 m\u0131, yoksa kontrols\u00fcz b\u00fcy\u00fcyen bir \\\"dijital \u00e7\u00f6p kutusu\\\" mu? Bu makale, concerns klas\u00f6r\u00fcn\u00fcn derinliklerine inerek hem faydalar\u0131n\u0131 hem de olas\u0131 tuzaklar\u0131n\u0131 ayd\u0131nlat\u0131yor, do\u011fru kullan\u0131m senaryolar\u0131n\u0131 ve en iyi pratikleri ad\u0131m ad\u0131m inceliyor.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"concerns\/ Klas\u00f6r\u00fc: Mimari D\u00fczenleyici mi, Dijital \u00c7\u00f6p Kutusu mu?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"concerns\/ Klas\u00f6r\u00fc: Mimari D\u00fczenleyici mi, Dijital \u00c7\u00f6p Kutusu mu?","description":"Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, \u00f6zellikle Ruby on Rails gibi modern framework'lerde s\u0131k\u00e7a kar\u015f\u0131m\u0131za \u00e7\u0131kan concerns\/ klas\u00f6r\u00fc, kimi zaman bir kurtar\u0131c\u0131, kimi zaman ise bir karma\u015fa kayna\u011f\u0131 olabilir. Peki, bu dizin ger\u00e7ekten de kod taban\u0131n\u0131z\u0131 d\u00fczenleyen bir mimari harikas\u0131 m\u0131, yoksa kontrols\u00fcz b\u00fcy\u00fcyen bir \"dijital \u00e7\u00f6p kutusu\" mu? Bu makale, concerns klas\u00f6r\u00fcn\u00fcn derinliklerine inerek hem faydalar\u0131n\u0131 hem de olas\u0131 tuzaklar\u0131n\u0131 ayd\u0131nlat\u0131yor, do\u011fru kullan\u0131m senaryolar\u0131n\u0131 ve en iyi pratikleri ad\u0131m ad\u0131m inceliyor.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/","og_locale":"tr_TR","og_type":"article","og_title":"concerns\/ Klas\u00f6r\u00fc: Mimari D\u00fczenleyici mi, Dijital \u00c7\u00f6p Kutusu mu?","og_description":"Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, \u00f6zellikle Ruby on Rails gibi modern framework'lerde s\u0131k\u00e7a kar\u015f\u0131m\u0131za \u00e7\u0131kan concerns\/ klas\u00f6r\u00fc, kimi zaman bir kurtar\u0131c\u0131, kimi zaman ise bir karma\u015fa kayna\u011f\u0131 olabilir. Peki, bu dizin ger\u00e7ekten de kod taban\u0131n\u0131z\u0131 d\u00fczenleyen bir mimari harikas\u0131 m\u0131, yoksa kontrols\u00fcz b\u00fcy\u00fcyen bir \"dijital \u00e7\u00f6p kutusu\" mu? Bu makale, concerns klas\u00f6r\u00fcn\u00fcn derinliklerine inerek hem faydalar\u0131n\u0131 hem de olas\u0131 tuzaklar\u0131n\u0131 ayd\u0131nlat\u0131yor, do\u011fru kullan\u0131m senaryolar\u0131n\u0131 ve en iyi pratikleri ad\u0131m ad\u0131m inceliyor.","og_url":"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-21T23:31:17+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"27 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"concerns\/ Klas\u00f6r\u00fc: Mimari D\u00fczenleyici mi, Dijital \u00c7\u00f6p Kutusu mu?","datePublished":"2025-10-21T23:31:17+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/"},"wordCount":4556,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/","url":"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/","name":"concerns\/ Klas\u00f6r\u00fc: Mimari D\u00fczenleyici mi, Dijital \u00c7\u00f6p Kutusu mu?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-21T23:31:17+00:00","description":"Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, \u00f6zellikle Ruby on Rails gibi modern framework'lerde s\u0131k\u00e7a kar\u015f\u0131m\u0131za \u00e7\u0131kan concerns\/ klas\u00f6r\u00fc, kimi zaman bir kurtar\u0131c\u0131, kimi zaman ise bir karma\u015fa kayna\u011f\u0131 olabilir. Peki, bu dizin ger\u00e7ekten de kod taban\u0131n\u0131z\u0131 d\u00fczenleyen bir mimari harikas\u0131 m\u0131, yoksa kontrols\u00fcz b\u00fcy\u00fcyen bir \"dijital \u00e7\u00f6p kutusu\" mu? Bu makale, concerns klas\u00f6r\u00fcn\u00fcn derinliklerine inerek hem faydalar\u0131n\u0131 hem de olas\u0131 tuzaklar\u0131n\u0131 ayd\u0131nlat\u0131yor, do\u011fru kullan\u0131m senaryolar\u0131n\u0131 ve en iyi pratikleri ad\u0131m ad\u0131m inceliyor.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/concerns-klasoru-mimari-duzenleyici-mi-dijital-cop-kutusu-mu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"concerns\/ Klas\u00f6r\u00fc: Mimari D\u00fczenleyici mi, Dijital \u00c7\u00f6p Kutusu mu?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32458","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32458"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32458\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32458"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32458"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32458"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}