Bir sistemi tasarlarken, tasarımı kullanacağınız çerçeve çevresinde sağlamak en iyi yöntem midir?


37

Belirli bir çerçeveyle kullanmayı planladığınız bir sistem veya uygulama geliştirirken, sistemi çerçeveyi düşünmeden tasarlamak en iyi yöntem mi, yoksa sistemi zihniyetle "daha iyi mi tasarlamak" çerçevenin daha kolay bir zaman alacağı Bununla".


4
Ne tür bir çerçeveden bahsediyorsun? Belirli bir sektör için etki alanına özgü sorunları çözmek için tasarlanmış, belirli bir işletmeye özgü çerçeveyi mi kastediyorsunuz? (örneğin tıbbi, nükleer, savunma, havacılık vb.). Yoksa teknik sorunları çözmek için tasarlanmış genel amaçlı çerçevelerden mi bahsediyorsunuz?
Ben Cottrell

1
teknik problemleri çözmek için tasarlanmış genel amaçlı çerçeveler
Robert Pounder

2
Zaman eksikliği için küçük ölçek (işteyim, sonra detaylandırabilirim): Tasarımlara dayalı e-postalar üreten bir sistem yazıyorum. - Bunu Laravel'de yazıyor olsaydım, muhtemelen e-postalarını tasarlamak için şablon motorlarını "blade" kullanmaya devam edecektim, bu da sistemin tasarımını akış açısından çok daha basit hale getirecekti. Bununla birlikte, eğer vanilya PHP yapıyor olsaydım bir şablonlama motoru yazmaya ya da başka bir uygun şablonlama sistemi bulmak zorunda kalacağım. Sorunun da bahsettiği tasarım sürecine katkıda bulunacaktır.
Robert Pounder

3
Bu soru, çok farklı cevaplar üretecek çünkü hem "çerçeve" hem de "tasarım", endüstrimizdeki birden çok anlamla aşırı yüklenmiş kelimelerdir. Ayrıca, “teknik sorunları çözmek için tasarlanmış genel amaçlı çerçeveler” olarak tanımlanan tek bir çerçeve tanımı için bile, belirli çerçeveye bağlı olacaktır - bazı çerçeveler diğerlerinden daha fazla düşünülmektedir.
stannius

1
Tekerlekli toplu taşıma aracını tasarlamaya çalışırken düşünüldüğünde bir otobüse çarpmak çok kötü olurdu.

Yanıtlar:


51

Sizin tasarım müşterileri karşılamak gerektiği gibi yakından ellerinden geldiğince ihtiyacı vardır. Unutmayın ki tasarım aşağıdaki gibi küçük şeyler içerir:

  • Kullanıcı deneyimi
  • İşlevsellik
  • Uygulamanızın parçaları nasıl iletişim kurar (kendisiyle veya dış varlıklarla)

Bunların hiçbiri çerçeve tarafından dikte edilmemelidir. Bu hedeflere ulaşmak için çerçevenizle mücadele edeceğiniz açıksa, kod yazmaya başlamadan önce bu hedefleri gerçekleştirmenize yardımcı olacak yeni bir çerçeve seçersiniz.

Uygun bir araç takımı seçtiğinizde (çerçeve bir araçtır), araçları kullanmaları için tasarlandıkları şekilde kullanmanızı öneririm. Çerçeve tasarımından ne kadar saparsanız, ekibiniz için öğrenme eğrisini o kadar arttırırsınız ve bir şeylerin yanlış gitme şansı artar.

Kısacası

  • Kullanıcılarınız için tasarım
  • Tasarımınızı gerçekleştirmek için uygun araçları seçin
  • Araçlarınızı, kullanmaları için tasarlandıkları şekilde kullanın

Diğer Düşünceler:

20 yılı aşkın yazılım mühendisliği ve birkaç çerçeve kullandıktan sonra birkaç ders aldım. Tüm çerçeveler iki ucu keskin bir kılıçtır: ikisi de kısıtlar ve etkinleştirir. Yukarıda bahsettiğim büyük 3'e bakmadan önce çerçevenize karar vermemizdeki sorun, vasat (en iyi ihtimalle) deneyim için iyi bir kullanıcı deneyiminden ödün vermiş olmanız olabilir. Veya belirli bir işlevi yerine getirmek için çerçeveler tasarımından sapmak zorunda kalabilirsiniz.


3
O zaman müşteri ile bazı görüşmeler yapmanız gerekir. Elde ettikleri sınırlamalarla neler yapabileceğinizi ve yapamayacağınızı açıklayın. X çerçevesini seçerseniz bunun nasıl değişebileceğini önerin . Değişime istekli olmayabilir ve bozulmuş bir deneyimle yaşamaya istekli olabilirler. Veya ne yaptığınızı bildiğinize ve size güvendiğinize karar verebilirler. Bu müşteriye bağlı. Günün sonunda beklentilerini yönetiyorsun.
Berin Loritsch

4
Buradaki farklı tasarım seviyeleri arasında bir karışıklık var gibi görünüyor: sistem tasarımı ve detaylı tasarım. Bana göre bu soru sistemden (arayüzler, eşzamanlılık, veri hacmi, kullanıcı arayüzü, kullanıcı tipi) değil, detaylı tasarım (uygulama yöntemi) hakkında sorular soruyordu.
Gusdor

2
Eğer soru "teknik tasarım" etrafında dönerse, dil ve işletim sistemi tasarımda bazı çıkarımlar yapabilir. Ancak yine de tasarım uygulama değildir. Altyapı yeteneklerini düşünüyorsanız, Bu tasarım değil, Uygulamadır. Tasarım kararlarınızı çerçeve dayanaklarına dayandırırsanız, zayıflığınız için kendinizi hazırlayın. Ve zayıflık gereksinimleri karşıladığında, çok büyük bir problemin var. En büyük şirketler zevk için kullanılan çerçeveler inşa etmediler.
Laiv

1
@Laiv Harika bir yorum! Gerçekten, "bazıları ve bazıları" dır. Bir çivi tabancası ve bir tornavida, her ikisini de sabitleyebilir, biri diğerinden daha geri dönüşümlüdür ve daha yavaş çalışır ve daha karmaşıktır. İnsanların yaptığı her seçim kaçınılmaz bir şekilde bir sapmadır. Paranı ödüyorsun ve şansını alıyorsun

1
@RobertPounder, bir çözüm karar verilmesi gereken için uygunluğu olan bir araçtır ise sistemin tasarlanması. Çerçevelerin tasarımı nasıl etkileyebileceğini biliyorum, ama dikte etmemeliler.
Berin Loritsch

27

Altyapılar doğal olarak belirli modüllerin ve alt sistemlerin (bir GUI ön uç gibi) tasarımını etkiler . Bahsedilen diğer cevabın belirttiği gibi, seçtiğiniz çerçeve (ler) e karşı mücadele ederken kendinizi zor anlarsınız.

Bununla birlikte, daha genel olarak, herhangi bir tek bir çerçevenin veya teknolojinin genel sistem mimarinizin "büyük resmini" dikte etmesine veya sürmesine izin vermekten kaçınmalısınız. Çoğu genel amaçlı uygulama çerçevesi bunu desteklememektedir, bu nedenle kendinizi tüm sisteminizi bir çerçeve çevresinde yazıyorsanız, o zaman muhtemelen o çerçevenin yazarlarının istemediği bir şey yapıyorsunuz demektir.

Farklı sorunları çözmek için büyük olasılıkla birçok farklı çerçeve kullanacaksınız; Sisteminiz daha karmaşık hale geldikçe, The Big Ball of Mud (Çamur Topu) inşa etmemeye dikkat etmeniz gerekir . Mümkünse, sisteminizi modüler ve gevşek bir şekilde bağlı tutun. Bazı çerçeveler, Çerçeveye özgü iş akışlarını diğer bileşenlerden uzağa 'gizleyen' sarmalayıcılar ve adaptörler yazarak soyutlamaların ardında daha iyi tutulabilir. GUI araç kitleri yalnızca ön uç GUI işlevselliğine hizmet eder, bu yüzden bu GUI modülleri sistemin geri kalanından uzak tutulmalıdır.

Genel amaçlı çerçeveler (örneğin UI çerçeveleri, veri katmanı çerçeveleri, vb.) Sisteminizin tüm mimarisini belirlemek için mevcut değildir - en çok bir bileşenin veya modülün tasarımını önerebilirler; örneğin, bazı GUI teknolojileri, belirli MV * modellerine yöneliktir.

Sisteminizin genel mimarisi öncelikle işletme gereksinimleriniz tarafından yönlendirilmelidir . Her şeyi bir araya getirmek için kendinizi belirli bir araca (örneğin, bir mesajlaşma yazılımı aracı veya bir ORM çerçevesine) yaslanmış olarak bulabilirsiniz, ancak çerçeveyi bir 'hizmet' sınıfı gibi bir soyutlamada kullandıysanız Sınırlamaları ile karşılaştığınızda kendinizi bu çerçeveyle kısıtladığınızı bulma olasılığınız daha düşüktür.

Büyük resim tasarımınız için aşağıdakileri göz önünde bulundurmaya çalışın:


Bazen, bazı çerçeve yazarlarının, kullanıcılarının, uygulama kodunu, çerçeve ile sıkı bir şekilde bir araya geldiklerinde yazmalarını hiç umursamadıkları görülmektedir.
GELMEKTEDİR

2
@COMEFROM - Kodunuzu bir çerçeveye sıkıca bağlamak, geliştiriciler tarafından teşvik edilecektir çünkü ilk önce tasarladıkları aynı sorunları çözmek için çerçevelerini seçtiklerini varsayıyorlar.
JeffO

Tasarım prensiplerinden kodlama prensiplerine geçerek biraz konuştunuz, ama ne söyleyeceğinize karar verdim, peki ya iş gereksinimi belli bir çerçeve kullanılıyorsa? (şirketin dışarıdan kaynaklandığını ve şirket içi devlerin yalnızca bir dil bildiğini düşünün) sanırım orijinal yazıdaki durumu daha netleştirmeliyim.
Robert Pounder

1
@RobertPounder Almaya çalıştığım gerçek nokta (belki de pek iyi değil) bazen insanların tüm uygulamaları için belirli çerçeveleri “topraklama” olarak kullanma eğilimi göstermesidir - kaçınılmaz olarak iş mantığına ve diğerlerine yol açar. ilgisiz kodun bu çerçeveyle uygunsuz bir şekilde kaynaşması - örneğin, o zamanlar hızlı ve kolay olduğu için UI kontrolleriyle birleştirilmiş iş mantığı. Bunu yapmak çok kolay, bu yüzden dikkatli olunacak bir şey var
Ben Cottrell

2
Burada @nocomprende ile aynı fikirde olmamalı; Gelecekteki tüm gereksinimler tahmin edilemez, ancak bazen önceki yazılımın genişletilmesi / bakımı zor olduğu için sistemler yeniden yazılabilir .
SeldomNeedy

7

Evet, çerçevenin size yapmayı "söylediği" şeye mümkün olduğunca yakın durmalısınız .

Bunun nedeni, “düşünme” çerçevesine ne kadar yakın bir şekilde yapışırsanız, diğer geliştiricilerle o çerçeveyi kullanan sorunlarınız / düşünceleriniz hakkında konuşmanız o kadar kolay olacaktır.

Daha sonra kullanan diğer insanlar için birlikte çalışabilirliği ve kullanım kolaylığını arttırırsınız, kullandığınızın temel felsefesine bağlı kalırsanız, öğreticileri veya ortak çözümleri daha iyi anlayacak ve dahil edersiniz.

Neden çerçeveyi “kırdığınızı” düşünebilmemin tek iyi nedeni, “varsayılan” yapılandırma / ilkelerin uygulanması için veremeyecekleri bir şeye ihtiyacınız olması gerektiğidir. Ancak daha sonra başlamak için doğru çerçeve olmayabilir.

Temel olarak, bu diğer kararlara da uygulanabilir. Kullandığınız dili, kullanılması gerektiği gibi kullanmalısınız, çünkü herkesle aynı dili konuşmanız daha kolay .


Sorunun değişiklikleri nedeniyle cevabınızı gözden geçirmelisiniz. Cevabınız aslında OP'nin sorusuna cevap vermiyor.
Laiv,

1
@Laiv Konu hakkındaki fikrinize uymasa da soruyu nasıl cevaplayamadığını anlamıyorum, yine de bir cevap. Söz konusu konunun çelişkili doğasını görüntülemek için kendi cevabınızı yazabilirsiniz.
FP

Afedersiniz, kendimi iyi açıklayamadım. İngilizce olmak istediğim kadar akıcı değilim. Sadece şunu söylemek istedim, IMO, soru ve cevabınız farklı şeyler hakkında konuşur. Yapmadıklarını düşünüyorsanız, sorun değil. Bunu tartışmayacağım. Bu kadar.
Laiv

1
Bu kesinlikle öyle. Etki Alanına Özel Dillerin ve benzer fikirlerin çalışma biçimine benzer. Ürünleriniz, başka bir şekilde değil, araç (Çerçeve) ile biçimlendirilir. Çerçeve "kazanır". Onunla evlenemiyorsan, başka bir tane seç. (İpucu: ideal bir Çerçeve yok . Sadece söyleyerek.)

1
Tasarımınız, seçtiğiniz çerçeveyi (eğer varsa!) Tam tersi yönde etkilemelidir.
RubberDuck
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.