{"id":26297143,"url":"https://github.com/tanerceker/prefer-composition","last_synced_at":"2026-02-11T03:06:39.432Z","repository":{"id":201226474,"uuid":"707259046","full_name":"tanerceker/prefer-composition","owner":"tanerceker","description":"Prefer Composition over Inheritance","archived":false,"fork":false,"pushed_at":"2023-11-01T19:31:09.000Z","size":2,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-23T19:46:31.413Z","etag":null,"topics":["composition","inheritance","oop","oop-principles"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tanerceker.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-10-19T14:31:59.000Z","updated_at":"2023-10-19T14:36:05.000Z","dependencies_parsed_at":"2023-11-01T20:29:28.053Z","dependency_job_id":null,"html_url":"https://github.com/tanerceker/prefer-composition","commit_stats":null,"previous_names":["tanerceker/prefer-composition"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tanerceker/prefer-composition","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tanerceker%2Fprefer-composition","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tanerceker%2Fprefer-composition/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tanerceker%2Fprefer-composition/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tanerceker%2Fprefer-composition/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tanerceker","download_url":"https://codeload.github.com/tanerceker/prefer-composition/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tanerceker%2Fprefer-composition/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29326078,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-11T02:08:56.257Z","status":"ssl_error","status_checked_at":"2026-02-11T02:08:51.338Z","response_time":97,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["composition","inheritance","oop","oop-principles"],"created_at":"2025-03-15T05:29:18.542Z","updated_at":"2026-02-11T03:06:39.405Z","avatar_url":"https://github.com/tanerceker.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cbr/\u003e\n\n# Kalıtım (Inheritance) Yerine Bileşim (Composition) Tercih Edin\n\nNesne-yönelimli programlamada (OOP) bileşim (composition), daha basit nesneleri veya bileşenleri birleştirerek karmaşık nesneler oluşturmak için kalıtıma (inheritance) bir alternatiftir. Bileşim (Composition), geleneksel kalıtıma (inheritance) kıyasla kodun yeniden kullanılabilirliğini, esnekliğini ve daha modüler bir tasarımı destekler. Typescript'te, bileşimi (composition) çeşitli şekillerde kullanabilirsiniz ve her biri için örnekler vereceğim.\n\n\u003cbr/\u003e\n\n---\n\n\u003cbr/\u003e\n\n### Örnek 1: Basit Bileşim — Simple Composition\n\nJob bileşenine sahip bir Person sınıfı oluşturmak istediğimizi varsayalım.\nKalıtım (Inheritance) kullanmak yerine Bileşim (Composition) kullanacağız.\n\n```tsx\nclass Job {\n  constructor(private title: string, private salary: number) {}\n\n  getDetails() {\n    return `${this.title} - Salary: $${this.salary}`;\n  }\n}\n\nclass Person {\n  constructor(private name: string, private age: number, private job: Job) {}\n\n  info() {\n    return `Hi, I'm ${this.name}, ${\n      this.age\n    } years old. ${this.job.getDetails()}`;\n  }\n}\n\nconst softwareEngineer = new Job(\"Software Developer\", 10000);\nconst person = new Person(\"Alice\", 27, softwareEngineer);\n\nconsole.log(person.info());\n```\n\nBu örnekte, bir Job sınıfı ve Job sınıfının bir örneğini içeren bir Person sınıfı oluşturduk. Bu basit bir bileşim (composition) örneğidir.\n\n\u003cbr/\u003e\n\n---\n\n\u003cbr/\u003e\n\n### Örnek 2: Arayüzleri Kullanmak — Use Interfaces\n\nOluşturulan bileşenler (components) için belirli bir yapıyı zorunlu kılmak üzere arayüzleri (interfaces) de kullanabilirsiniz:\n\n```tsx\ninterface Engine {\n  start(): void;\n  stop(): void;\n}\n\nclass ElectricEngine implements Engine {\n  start() {\n    console.log(\"Electric engine started.\");\n  }\n\n  stop() {\n    console.log(\"Electric engine stopped.\");\n  }\n}\n\nclass Car {\n  constructor(\n    private make: string,\n    private model: string,\n    private engine: Engine\n  ) {}\n\n  drive() {\n    console.log(`Driving a ${this.make} ${this.model}`);\n    this.engine.start();\n  }\n\n  stop() {\n    this.engine.stop();\n  }\n}\n\nconst electricEngine = new ElectricEngine();\nconst tesla = new Car(\"Tesla\", \"Model 3\", electricEngine);\n\ntesla.drive();\ntesla.stop();\n```\n\nBu örnekte, bir Engine arayüzüne sahibiz ve Car sınıfı, Engine arayüzünü uygulayarak farklı motor türlerini (örneğin, elektrikli, benzinli) birleştirmek için bileşimi (composition) kullanır.\n\n\u003cbr/\u003e\n\n---\n\n\u003cbr/\u003e\n\n### Örnek 3: Dinamik Bileşim — Dynamic Composition\n\nBileşim (Composition), bileşenleri dinamik olarak değiştirmenize olanak tanıyarak kodunuzu daha esnek hale getirir:\n\n```tsx\nclass Camera {\n  takePhoto() {\n    console.log(\"Taking a photo\");\n  }\n}\n\nclass MusicPlayer {\n  playMusic() {\n    console.log(\"Playing music\");\n  }\n}\n\nclass Smartphone {\n  private camera: Camera | null;\n  private musicPlayer: MusicPlayer | null;\n\n  attachCamera(camera: Camera) {\n    this.camera = camera;\n  }\n\n  attachMusicPlayer(player: MusicPlayer) {\n    this.musicPlayer = player;\n  }\n\n  useCamera() {\n    if (this.camera) {\n      this.camera.takePhoto();\n    } else {\n      console.log(\"No camera attached.\");\n    }\n  }\n\n  useMusicPlayer() {\n    if (this.musicPlayer) {\n      this.musicPlayer.playMusic();\n    } else {\n      console.log(\"No music player attached.\");\n    }\n  }\n}\n\nconst smartphone = new Smartphone();\nsmartphone.useCamera(); // Output: No camera attached.\nsmartphone.useMusicPlayer(); // Output: No music player attached.\n\nconst camera = new Camera();\nconst musicPlayer = new MusicPlayer();\n\nsmartphone.attachCamera(camera);\nsmartphone.attachMusicPlayer(musicPlayer);\n\nsmartphone.useCamera(); // Output: Taking a photo\nsmartphone.useMusicPlayer(); // Output: Playing music\n```\n\nBu örnekte Smartphone sınıfı, bileşenleri (camera ve music player) dinamik olarak eklemenize ve çıkarmanıza olanak tanır.\n\n\u003cbr/\u003e\n\nBu örnekler, Typescript'teki bileşimin (composition), kalıtıma (inheritance) dayanmadan esnek ve yeniden kullanılabilir yazılım bileşenleri oluşturmanıza nasıl olanak sağladığını göstermektedir. Daha modüler ve bakımı kolay bir kod tabanını destekler.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanerceker%2Fprefer-composition","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftanerceker%2Fprefer-composition","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanerceker%2Fprefer-composition/lists"}