Ayrıştırma nedir ve hangi geliştirme alanlarına uygulanabilir? [kapalı]


21

Kısa bir süre önce, ayrıştırmayı bir soruda bir konu olarak fark ettim ve bunun ne olduğunu ve nerede uygulanabileceğini bilmek istiyorum.

"Nereye başvurabilirim" ile kastediyorum:

Sadece C ve Java gibi derlenmiş dillerin dahil olduğu yerlerde mi alakalı?

Bir web geliştiricisi olarak bilmeli / araştırmalı mıyım?


Biraz araştırma yapmış ve tanımın belirsiz kısımlarına dayanan bir soru sormanız faydalı olacaktır.
JeffO

2
@JeffO - Bence dünya, belirli nüanslardan olduğu kadar tam konsept sorulardan da faydalanıyor. "Gökyüzü neden mavi?" cevaplar, ayrıntılar üzerinde aşırı ayrıntılara girmeden kavramın kendisini kapsamaktadır. Bu yüzden devam ettim ve sorumu araştırma yapmadan sordum.

Yaşadığınız sorun nedir? Mevcut haliyle, sizin soru çok çok geniş. Bu haliyle, cevap aslında Yapılandırılmış Tasarım: Edward Yourdon ve Larry Constantine'nin Bilgisayar Programının ve Sistem Tasarımının Bir Disiplininin Temelleri metnidir .
Jörg W Mittag

Bence buradaki cevaplar, konsepti tanımlamak için mükemmel bir iş çıkarıyor. Bu "Programlama ile ilgili bu kelimenin tanımı nedir" diye sormak gibidir. Peki bu nasıl geniş? @ GlenH7

1
@ jt0dd Kabul etmek zorundayım. Bir kitabı bir şeyi açıklayabilmeniz, daha özlü bir cevapta değer olmadığı anlamına gelmez. Programlama literatürüyle, insanlar genellikle daha iyi bir üst düzey genel bakış vermeden önce sizi ayrıntılarla doldururlar. "OOP nedir?" çok geniş olurdu. Ama bu oldukça spesifik bir konu IMO'su.
Erik Reppen

Yanıtlar:


57

'Kuplaj' bir yazılım sistemindeki iki varlık (genellikle sınıflar) arasındaki ilişkiyi tanımlayan bir terimdir.

Bir sınıf başka bir sınıf kullandığında veya onunla iletişim kurduğunda, bu diğer sınıfa 'bağımlı' olduğu ve bu sınıfların 'birleştirildiği' söylenir. Bunlardan en az biri diğerini 'biliyor'.

Fikir şu ki, sistemlerimizdeki sınıflar arasındaki bağlantıyı mümkün olduğunca 'gevşek' tutmaya çalışmalıyız: dolayısıyla 'gevşek bağlantı' veya bazen 'ayırma' (İngilizce'de 'ayırma', 'hiç bağlantı yok' anlamına gelse de, insanlar genellikle varlıklar arasında 'gevşek bağlantı' anlamına gelir).

Peki: uygulamada güçlü bağlamaya karşı gevşek bağlantı nedir ve varlıkları neden gevşek bağlı yapalım?


Birleştirme, bir varlık ile diğer bir varlık arasındaki bağımlılık derecesini tanımlar. Genellikle sınıflar veya nesneler.

ClassA büyük ölçüde ClassB'ye bağlı olduğunda, ClassB değiştirildiğinde ClassA'nın etkilenme şansı yüksektir. Bu güçlü bir bağlantıdır.

Bununla birlikte, ClassA hafifçe ClassB'ye bağlıysa, ClassA'nın ClassB kodundaki bir değişiklikten herhangi bir şekilde etkilenme şansı düşüktür. Bu gevşek bir bağlanma ya da 'ayrıştırılmış' bir ilişkidir.

Gevşek bağlantı iyidir, çünkü sistemimizin bileşenlerinin büyük ölçüde birbirine bağlı olmasını istemiyoruz. Bir parçayı diğerini etkilemeden güvenle değiştirebileceğimiz sistemimizi modüler tutmak istiyoruz .

İki parça gevşek bir şekilde bağlandığında, birbirlerinden daha bağımsızdırlar ve diğer değiştiğinde kırılma olasılığı daha düşüktür.

Örneğin, bir araba inşa ederken, motordaki dahili bir değişikliğin direksiyon simidindeki bir şeyi kırmasını istemezsiniz.

Bir araba inşa ederken bu asla kazara olmazken, programcılara her zaman benzer şeyler olur. Gevşek bağlantı, bu tür şeylerin meydana gelme riskini azaltmak içindir.

Güçlü birleşme genellikle A işletmesinin B işletmesi hakkında çok fazla bilgi sahibi olması durumunda ortaya çıkar. A işletmesi, B işletmesinin nasıl çalıştığı veya nasıl inşa edildiği hakkında çok fazla varsayım yaparsa, B işletmesindeki bir değişikliğin A işletmesini etkileme riski yüksektir. This çünkü B varlığıyla ilgili varsayımlarından biri artık yanlış.

Örneğin, bir sürücü olarak, aracınızın motorunun nasıl çalıştığı hakkında bazı varsayımlar yapacağınızı düşünün.

Farklı çalışan bir motora sahip yeni bir araba satın aldığınız gün (veya bir nedenle motorunuzun değiştirilmesi), önceki varsayımlarınız yanlış olur. Bir bilgisayarda kod olsaydınız, artık düzgün çalışmayan yanlış kod olurdu.

Bununla birlikte, bir sürücü olarak otomobiller hakkında yaptığınız tüm varsayımlar şuysa: A- direksiyonları ve B- fren ve gaz pedalları var, arabadaki değişiklikler sizi birkaç varsayımınız olduğu sürece etkilemez doğru kal. Bu gevşek bağlantıdır.


Gevşek kuplaj elde etmek için önemli bir teknik Kapsülleme'dir.Buradaki fikir, bir sınıfın diğer ayrıntılardan gelen iç ayrıntılarını gizlemesi ve diğer sınıfların kendisiyle iletişim kurması için kesin olarak tanımlanmış bir arabirim sunmasıdır.

Bir sınıf Araba tanımlayan olsaydı Yani, örneğin, bu arayüzü (kamu yöntemleri) muhtemelen olacaktır drive(), stop(), steerLeft(), steerRight(),getSpeed() . Bunlar, diğer nesnelerin Araba nesnelerinde çağırabileceği yöntemlerdir.

Araba sınıfının diğer tüm ayrıntıları: motorun nasıl çalıştığı, kullandığı yakıt türü, vb. Diğer sınıflardan gizlenir - Araba hakkında çok fazla şey bilmelerini önlemek için.

A sınıfı B sınıfı hakkında çok şey biliyor: A sınıfı B sınıfına çok bağımlı ve B sınıfındaki bir değişikliğin A sınıfını etkilemesi muhtemel, güçlü bir şekilde birleşmiş bir ilişkimiz var .

İki varlık arasındaki, birbirleri hakkında çok az şey bildikleri bir ilişki (sadece gerekli olan) - gevşek bir şekilde bağlanmış veya ayrıştırılmış bir ilişkidir.


3

Ayrıştırma genellikle iki şeyin birlikte çalışması gerekip gerekmediğini veya bağımsız hale getirilip getirilemeyeceğini görmekle ilgilidir. Bağımsızlık harika çünkü bu şeyleri değiştirmeyi veya başka bir yerde kullanmayı kolaylaştırıyor. Dekuplaj sadece gelişim değil birçok alanda uygulanabilir ve bu özellikle günlük yaşamınızda (bir dereceye kadar) bile uygulanabilen zamansal dekuplaj için geçerlidir. Ayrıca, yazılım geliştirmede dikkate alınması gereken birçok bağlantı türü vardır ve bunların hepsi yanıtta ele alınmayacaktır. Araştırmanızı yapmanız gerekecek.

Aralarında bir bağımlılık varsa A ve B olmak üzere iki şey birleştirilir. A'nın B'ye bağlı olması durumunda, A'yı dikkate almadan B'yi kullanabilirsiniz. A'yı kullanmak istiyorsanız, A'ya bağlı olduğu için B'yi de taşımanız gerekecektir.

Yazılım geliştirmede genellikle bileşenler arasındaki bağlantıyı tamamen kaldıramazsınız. Bu bağlamda ayrılma normal olarak mevcut bağlantıyı gevşetmek anlamına gelir . Yani, her bileşenin çevresindeki diğer bileşenler hakkında mümkün olduğunca az bilgi sahibi olduğundan emin olun.

Bu muhtemelen vahşi doğada bulunan en yaygın bağlantı türüdür:

//Inside a class meant to display info for a particular Facebook user.
void DisplayFriends(FacebookUser user, FacebookClient client)
{
     Friend[] = (Friend[])client.GetConnection().ExecuteCommandForResult("getFriends:" + user.Name);
     ...
}

Burada DisplayFriends, ihtiyaç duyduklarını elde etmek için Facebook istemcisinin arkasındaki bağlantıyla gereksiz yere elle çalışıyor. DisplayFriendsbireyin sınıfı hem de birleştirilir FacebookClientve Connection. FacebookClient aniden kullandığı bağlantı türünü değiştirirse, uygulama artık Facebook arkadaşlarını alamaz. Facebook'tan müşteriye ihtiyacımız olan şeyi sağlamasını isteyerek DisplayFriends 'sınıfı ile Bağlantı arasındaki bağlantıyı kaldırabiliriz.

//Inside a class meant to display info for a particular Facebook user.
void DisplayFriends(FacebookUser user, FacebookClient client)
{
     Friend[] = client.GetFriends(user);
     ...
}

Artık FacebookClient'in arkadaşlarımızı nasıl elde ettiği umrumda değil. Gerçekten önemsediğimiz, onları almasıdır. İç davranışına getirilen herhangi bir değişiklik kendi sınıfımıza zarar vermez.

Bu tür ayrışma, işlevler için Demeter Yasası'na uyularak kolayca gerçekleştirilebilir, (Wikipedia'dan alıntı yaparak):

İşlevler için Demeter Yasası, bir O nesnesinin m yönteminin yalnızca aşağıdaki nesne türlerinin yöntemlerini çağırmasını gerektirir:

  • O'nun kendisi
  • m'nin parametreleri
  • M içinde oluşturulmuş / oluşturulmuş nesneler
  • O'nun doğrudan bileşen nesneleri
  • M kapsamında O tarafından erişilebilen global bir değişken

Cevabın başlangıcında zamansal bağlantıdan bahsettiğim için, kısaca anlatacağım.

Geçici algoritma, algoritmaları paralel olarak yürüten uygulamalar tasarlanırken normalde dikkate alınır. A ve B olmak üzere iki yürütülebilir birim (bunlar gerçek talimatlar, yöntemler ya da bir birim olarak düşünmek istediğiniz ne olursa olsun), A ve B'yi düşünün. A geçici olarak B'ye bağlı değilse, A ve B aynı anda yürütülebilir. Bunun için kendi örneğinizi oluşturun: günlük yaşamınızda yaptığınız olağan şeyleri düşünün. Birbiri ardına yaptığınız iki şey var mı, ama aynı zamanda da yapabilirsiniz?

Son olarak, son bitinize cevap vermek için:

Bir web geliştiricisi olarak bilmeli / araştırmalı mıyım?

Evet. Örneğin, web geliştirme için en popüler tasarım modellerinden biri (MVC) tamamen ayrıştırmayla ilgilidir.


1

Diğer cevaplar ayrıştırmanın ne olduğunu açıklamak için iyi bir iş çıkarır. Son sorunuzu tartışmak istedim.

Bir web geliştiricisi olarak bilmeli / araştırmalı mıyım?

Cevap vurgulu bir evet. Ne tür bir geliştirici olduğunuz önemli değil. Bir web geliştiricisi veya gömülü bir sistem geliştiricisi olabilirsiniz.

Diyelim ki web sayfanıza yerleştirilmiş özel URL'ler üreten bir sınıfınız var. Sınıfın URL'leri doğrudan sayfaya yazmasını ve bunları bir etiketin href'ine yerleştirmesini isteyebilirsiniz. Bu başlangıçta daha basit görünebilir. Ancak, bağlantıları bir e-postaya koymak ve bir kullanıcıya göndermek için bir değişiklik yapmanız gerektiğinde ne olur? URL kodlayıcınız kullandığınız web çerçevesine sıkıca bağlı olduğundan geçerli kodunuz çalışmaz.

Daha iyi bir seçenek, URL'yi dize olarak döndüren bir URL oluşturma sınıfına sahip olmaktır. Bu, web kodunuz tarafından kullanılabilir ve e-posta kodunuz tarafından da kullanılabilir. Kodun ayrılması için daha fazla iş gibi görünebilir, ancak çaba zaman içinde kendini amorti eder.

Modülerleştirilmiş ve ayrıştırılmış koda sahip olmak, hangi programlama alanında çalıştığınıza bakılmaksızın kodunuzu daha anlaşılır, daha test edilebilir ve daha sürdürülebilir hale getirir.


Bu ve diğer iki cevaptan sonra, bunu gerçekten alıyorum ve nasıl kullanabileceğimi görüyorum.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.