Bir kavram verin ve modüler programlamayı karakterize edin. Unutulmuş programlama paradigmaları. Modülün genel yapısı

  • 31.10.2019

Modüllerin amacı

Standart Pascal, bir programın parçalarını ayrı ayrı derlemek ve daha sonra bunları çalıştırmadan önce birleştirmek için mekanizmalar sağlamaz. Ticari Pascal derleyicilerinin geliştiricilerinin, modülerliğini artıran dil araçlarını dahil etmeye çalışması oldukça anlaşılabilir.

Modül bildirim bölümünün çeşitli bileşenlerini (türler, sabitler, değişkenler, prosedürler ve işlevler) ve muhtemelen başlatıcı parçanın bazı yürütülebilir ifadelerini içeren, bağımsız olarak derlenmiş bir program birimidir.

Modüler programlamanın ana ilkesi böl ve yönettir. Modüler programlama, yapısı ve davranışı belirli kurallara uyan modüller adı verilen küçük bağımsız bloklar topluluğu olarak bir programın organizasyonudur.

Modüler programlamanın kullanılması, programınızı test etmeyi ve hataları bulmayı kolaylaştırır. Donanıma bağlı alt görevler, oluşturulan programların taşınabilirliğini artıran diğer alt görevlerden kesin olarak ayrılabilir.

Programlamada "modül" terimi, programların oluşturulmasında modüler ilkelerin tanıtılmasıyla bağlantılı olarak kullanılmaya başlandı. 70'lerde modül, belirli kurallara göre yazılmış herhangi bir prosedür veya fonksiyon olarak anlaşıldı. Örneğin: " Modül basit, kapalı (bağımsız), gözlemlenebilir (50 ila 100 satır arası), yalnızca bir görev işlevi uygulayan, bir giriş ve bir çıkış noktasına sahip olmalıdır.».

Parnas, bir yazılım modülünün temel özelliklerini az çok net bir şekilde formüle eden ilk kişiydi: “ Bir modül yazmak için yeterli olmalıasgari başka birinin metninin bilgisi". Bu nedenle, tanıma uygun olarak, bir modül hem hiyerarşinin en alt seviyesinde (uygulama seviyesi) hem de sadece diğer modül prosedürlerine yapılan çağrıların meydana geldiği en yüksek seviyede herhangi bir ayrı prosedür (fonksiyon) olabilir.

Böylece programlamada bilgi gizleme kavramını ilk ortaya atan Parnas olmuştur. Bununla birlikte, yalnızca 70'lerin dillerinde var olan prosedür ve işlev gibi sözdizimsel yapılar, karmaşık programlarda davranışını tahmin etmek zor olabilen küresel değişkenlerden etkilendikleri için güvenilir bilgi gizleme sağlayamadı.

Bu problem ancak global değişkenlerden etkilenmeyen yeni bir sözdizimi geliştirilerek çözülebilirdi.

Bu tasarım oluşturuldu ve bir modül olarak adlandırıldı. Başlangıçta, karmaşık yazılım sistemlerini uygularken, modülün belirli bir alt görevin uygulanmasının ayrıntılarını birleştiren ve güvenilir bir şekilde gizleyen bir yapı olarak prosedürler ve işlevlerle birlikte kullanılması gerektiği varsayılmıştır.

Bu nedenle, kompleksteki modüllerin sayısı, atanan görevin bağımsız alt görevlere ayrıştırılmasıyla belirlenmelidir. Aşırı durumda, bir modül, gerçekleştirdiği yerel eylemin herhangi bir değişiklik için programın diğer bölümlerinin etkisinden bağımsız olmasının garanti edilmesi gerekiyorsa, içine yalnızca bir prosedürü dahil etmek için bile kullanılabilir.

İlk kez, bir modülün özel bir sözdizimsel yapısı 1975'te N. Wirth tarafından önerildi ve yeni dili Modula'ya dahil edildi. Modüllerin mekanizması tanıtıldığında dilin özelliklerinin ne kadar değiştiği, N. Wirth'in Modula-2'nin sonraki dili hakkında yaptığı şu açıklama ile kanıtlanmıştır: "Modüller, Modula-2'nin dilini ayıran en önemli özelliktir. 2 selefi Pascal'dan."

Turbo Pascal modülleri, organizasyonları ve programdaki kullanımları açısından Ada programlama dilinin modül-paketlerine (PAKET) yakındır. Bunlarda, tıpkı Ada paketlerinde olduğu gibi, genel türlerin, sabitlerin, değişkenlerin tanımlarının ve ayrıca prosedür ve işlevlerin başlıklarının yoğunlaştığı belirli bir "görünür" arayüz kısmı açıkça vurgulanır. Arayüz bölümündeki nesnelerin görünümü, onları diğer modüller ve ana program için kullanılabilir hale getirir. Prosedürlerin ve işlevlerin gövdeleri, modülün kullanıcıdan gizlenebilen yürütülebilir bölümünde bulunur.

incir. 2. Yazılım projesi geliştirme sırası

Yazılım proje geliştirme teknolojisi için modüllerin değeri, Şekil 2'deki şema ile gösterilebilir. 2.

Modüller, uygulama kitaplıkları geliştirmek için mükemmel bir araçtır ve güçlü bir modüler programlama aracıdır. Modüllerin önemli bir özelliği, derleyicinin program kodunu ayrı bir bellek segmentine yerleştirmesidir. Segment uzunluğu 64 KB'yi geçemez, ancak aynı anda kullanılan modüllerin sayısı yalnızca büyük programlar oluşturmanıza izin veren kullanılabilir bellekle sınırlıdır.

Modül yapısı

Her modül aşağıdaki yapıya sahiptir:

Birim <имя_модуля>;

benarayüz

<интерфейсная часть>;

uygulama

<исполняемая часть>;

<инициирующая часть>;

Burada UNIT ayrılmış bir kelimedir (birim); bir modül başlığı başlatır;

<имя_модуля>- modül adı (doğru tanımlayıcı);

ARAYÜZ - ayrılmış kelime (arayüz); modülün arayüz kısmını başlatır;

UYGULAMA - ayrılmış kelime (yürütme); modülün yürütülebilir bölümünü başlatır;

BEGIN ayrılmış bir kelimedir; modülün başlangıç ​​kısmını başlatır; ve inşaatın başlaması<инициирующая часть>isteğe bağlı;

END - ayrılmış kelime - modülün sonunun işareti.

Bu nedenle, bir modül bir başlık ve herhangi biri boş olabilen üç bölümden oluşur.

Modülün genel yapısı, modülün her bölümünün anlamını ve amacını açıklayan yorumlarla desteklenerek aşağıda gösterilmiştir.

Birim Modül Tanımlayıcı;

{Arayüz bölümü}

arayüz

(Bu bölüm, bu modülün etkileşimini açıklar) (diğer özel ve standart modüllerin yanı sıra) (ana program ile. Başka bir deyişle, etkileşim) (modülün "dış dünya" ile.)

{Arayüz bölümü içe aktarma listesi}

(Bu liste, virgülle ayrılmış tanımlayıcıları içerir) (arayüz bölümlerinin bilgileri olması gereken modüllerin)

(bu modülde mevcut olacaktır. Burada açıklanması tavsiye edilir) (yalnızca bu modüllerin tanımlayıcıları, bilgileri) (bu modülün arayüz bölümünün açıklamalarında kullanılır.)

{Arayüz bölümü dışa aktarma listesi}

const (Dışa aktarma listesi, sabitleri açıklayan alt bölümlerden oluşur), tür (türler, değişkenler, prosedürlerin ve işlevlerin başlıkları) var (bu modülde tanımlanmıştır, ancak bunlara izin verilir) prosedür (chenot, aşağıdakileri içeren diğer tüm modüllerde ve programlarda) ad) işlevi (kullanım satırında bu birimin. Prosedürler ve işlevler için) (burada yalnızca başlıklar açıklanmıştır, ancak zorunlu olarak) (resmi parametrelerin tam açıklaması.)

{uygulama bölümü}

uygulama

(Bu bölüm, uygulama (kişisel) bölümünü gösterir) (başkaları tarafından erişilemeyen bu modülün açıklamaları) (modüller ve programlar. Başka bir deyişle - "iç mutfak")

{Uygulama bölümü içe aktarma listesi}

(Bu liste, virgülle ayrılmış tanımlayıcıları içerir) (arayüz bölümlerinin bilgileri olması gereken modüllerin) (bu modülde mevcuttur. Burada açıklanması tavsiye edilir) (gerekli tüm modüllerin tanımlayıcıları, bilgiler) ( bunun arayüz bölümünün açıklamalarında kullanılmayan) ( modül ve kimsenin bilmemesi gereken) (başka bir modül.)

{Modül açıklamalarının içindeki alt bölümler}

etiket (Bu alt bölümler etiketleri, sabitleri, türleri açıklar) const (değişkenleri, prosedürleri ve işlevleri tanımlayan) tür (bu modül tarafından gerçekleştirilen algoritmik eylemler ve) var (yalnızca "kişisel özellik" olan) prosedür (yalnızca bu modül . açıklamalar hiç biri için mevcut değildir) fonksiyon (başka bir modüle. Bundaki prosedür ve fonksiyonların başlıkları) (alt bölüm resmi bir liste olmadan belirtilebilir) (parametreler. Başlıklar parametrelerle belirtilmişse, o zaman) (listeleri aynı olmalıdır) için aynı listeye ) (arayüz bölümünde karşılık gelen prosedür (fonksiyon))

{Başlatma bölümü}

(Bu bölüm ilk ayarların operatörlerini belirtir) (modülün doğru çalışmasını başlatmak için gereklidir. Operatörler) (programda kullanılan modüllerin başlatılması bölümleri) (aynı programda programın ilk başlangıcında yürütülür. ) (modül tanımlayıcılarının açıklandığı sıra) (uses yan tümcesi. Başlatma ifadeleri gerekli değilse,) (başlangıç ​​sözcüğü atlanabilir.)

son.

Modül başlığı ve modülleri birbirine bağlama

Birim başlığı, ayrılmış sözcük biriminden ve ardından birim adından oluşur. Turbo Pascal ortamının düzgün çalışabilmesi ve büyük programların geliştirilmesini kolaylaştıran araçları birbirine bağlayabilmesi için, modül adı, disk dosyasının adıyla eşleşmelidir modülün kaynak kodunu içeren . Örneğin, bir modül başlığımız varsa

Birim astar;

daha sonra bu modülün kaynak kodu primer.pas dosyasındaki diskte bulunmalıdır.

Modül adı, onu diğer modüllere ve ana programa bağlamak için kullanılır. Bu bağlantı özel bir teklifle kurulur:

kullanır <список модулей>

Buraya KULLANIMLAR- ayrılmış kelime (kullanımlar);

<список модулей>- iletişimin kurulduğu modüllerin bir listesi; liste öğeleri - virgülle ayrılmış modül adları.

Programda modüller kullanılıyorsa, o zaman teklifkullanır <список модулей> program başlığından hemen sonra görünmelidir, yani ana programın açıklama bölümünü açmalıdır. Modüller diğer modülleri kullanabilir. Birimlerde, kullanımlar yan tümcesi<список модулей>kelime arayüzünden hemen sonra veya kelime uygulamasından hemen sonra görünebilir. İki kullanım maddesine de izin verilir, yani. hem orada hem de orada durabilir.

Arayüz parçası

Ön kısım, ayrılmış bir kelimeyle açılır ARAYÜZ... Bu bölüm, ana program ve/veya diğer modüller için mevcut olması gereken tüm global modül nesnelerinin (türler, sabitler, değişkenler ve alt rutinler) bildirimlerini içerir. Arayüz bölümünde global alt programlar bildirilirken, yalnızca başlıkları belirtilir, örneğin:

prosedür AddC (x, y: karmaşık, var z: karmaşık);

prosedür MulC (x, y: karmaşık, var z: karmaşık);

Herhangi bir meslekte, sadece programlamada değil, bir proje sırasında farklı duygusal durumlar yaşarsınız:

  • İlk olarak, beklentiler ve fırsatlar için coşku var.
  • Sonra heyecan gelir. İlk hatalar ve zorluklar sadece sizi kışkırtır, beyni ve hayal gücünü sonuna kadar çalışmaya zorlar.
  • Konsantrasyon daha sonra azalır. Bir noktada, uyarılara ve küçük hatalara dikkat etmeyi bırakır, bu sorunları çözmeyi daha sonraya ertelersiniz.
  • Sonuç olarak, motivasyonunuzu kaybedersiniz. Bir hatayı düzeltirsiniz - üç tane görünür. Yeni bir özellik eklemeye çalışıyorsunuz ancak bunun için çok fazla zaman harcamak istemiyorsunuz.

Bazı insanlar bunun normal olduğunu düşünüyor: Bu döngüyü her seferinde kabul etmeye ve yaşamaya değer. Aslında her şey biraz daha basit ve çözüm psikoloji alanında değil, kod oluşturma yaklaşımında yatıyor.

Klasik programlama problemi

Batı literatüründe, bir programın mimarisini tanımlamak için "büyük bir çamur yumağı" terimi vardır. Kelimesi kelimesine tercüme edelim. Grafiksel olarak, "büyük kir topu", bir daire üzerindeki noktalar, işlevsel öğeleri simgeleyen ve düz çizgiler - aralarındaki bağlantılar şeklinde temsil edilebilir:

Bir projeye koymadan önceki gözlerin gibi geliyor kulağa, değil mi?

Bu, çalışmanız gereken zorluğun, bir hata oluştuğunda kaç bağlantının dikkate alınması gerektiğinin bir örneğidir.

Programlama benzersiz bir disiplin değildir: diğer alanlardan gelen deneyimler burada uygulanabilir ve uygulanmalıdır. Örneğin bir bilgisayarı ele alalım. Üreticileri, kullanıcının çözdüğü çeşitli görevleri düşünmezler ve dahası, her küçük işlemci ve bellek için ayırmazlar. Bilgisayar, konektörler ve kablolar kullanılarak tek bir kasada birleştirilen bağımsız karmaşık nesnelerin bir koleksiyonudur. Nesneler benzersiz değil, sizin için özel olarak optimize edilmedi ve yine de işlerini mükemmel bir şekilde yapıyorlar.

Programlamada tamamen aynı çözümler var. Örneğin, kütüphaneler. Tekerleği yeniden icat etmek için değerli zamanınızı boşa harcamaktan kaçınmanıza yardımcı olurlar. Ancak, kütüphaneler özel görevler için etkili değildir - oluşturma çok zaman alacaktır ve tek bir tekrarlama oranıyla verimlilik sıfıra iner.

Bu durumda modüllere başvurmak daha faydalıdır. Modül, belirli bir işlevsel amaca sahip mantıksal olarak eksiksiz bir kod parçasıdır. Modüllerin etkileşimi için parametrelerin ve işlevselliğin değiştirilmesine izin vermeyen yöntemler kullanılır. Modüler programlamanın avantajları açıktır:

  • Geliştirmeyi hızlandırın.
  • Artan güvenilirlik.
  • Testin basitleştirilmesi.
  • değiştirilebilirlik.

Modüler programlama, her çalışanın yalnızca kendi işine konsantre olabileceği ve meslektaşlarının kararlarına bakmadığı grup geliştirmede son derece etkilidir. Bununla birlikte, bireysel bir yaklaşımda bile, en azından yukarıda açıklanan avantajları elde edersiniz.

Ama bu o kadar basit değil.

Modüler programlama sorunları

Modül kullanma fikri, kodu büyük ölçüde basitleştirmez; aralarındaki doğrudan bağlantı sayısını en aza indirmek önemlidir. Kontrolün tersine çevrilmesi (IoC) kavramına geldiğimiz yer burasıdır. Basitleştirilmiş - bu, kodun bireysel bileşenlerinin birbirinden maksimum düzeyde izole edildiği bir programlama ilkesidir. Yani, bir modülün ayrıntıları diğerinin uygulanmasını etkilememelidir. Bu, modüler koda doğrudan erişim sağlamayan arabirimler veya diğer görünümler kullanılarak elde edilir.

Günlük hayatta bunun gibi birçok örnek var. Uçak bileti almak veya hareket saatini öğrenmek için pilotu aramanıza gerek yok. Süt içmek için köye ya da fabrikaya gidip ineğin başında ruhunuzun üzerinde durmanız gerekmez. Bunun için her zaman aracılar vardır.

Modüler programlamada üç ana uygulama vardır:

  • Bağımlılık enjeksiyonu. Her elemanın kendi arayüzüne sahip olma şekli, modüllerin etkileşimi arayüzler aracılığıyla gerçekleşir.
  • Fabrika yöntemi. Başka nesneler yaratmak için tasarlanmış belirli bir nesnenin varlığına dayanır. Başka bir deyişle, çoğu nesne için ortak özellikleri birleştiren bir prototip programına giriş. Modüller arasında doğrudan bir etkileşim yoktur, tüm parametreler "fabrikadan" miras alınır.
  • Servis yöntemi. Nesne etkileşimi için bir arabellek olan ortak bir arabirim oluşturulur. Gerçek hayatta benzer bir işlev, çağrı merkezleri, mağazalar, reklam platformları vb. Tarafından gerçekleştirilir.

İlk IoC uygulaması en sık kullanılanı olmasına rağmen, diğer ikisi modüler programlamanın ilk adımları için daha iyidir. Bunun nedeni, arayüzlerin basit bir şekilde oluşturulmasının yalnızca modüllere erişimi sınırlaması ve kodun karmaşıklığını azaltmak için bağlantı sayısını da azaltmanız gerektiğidir. Rastgele diğer arabirimlere atıfta bulunan arabirimler, yalnızca kodu karmaşıklaştırır.

Bu sorunu çözmek için bir kod mimarisi geliştirmeniz gerekir. Kural olarak, herhangi bir uygulamanın dosya yapısına benzer:

Bu nedenle, modüler programlama, kontrolün tersine çevrilmesi ve net bir uygulama mimarisi ilkelerine destek, bir taşla üç kuşun vurulmasına yardımcı olacaktır:

  1. Net işlevsel kod ayrımı sağlayın. Hatalar oluştuğunda, kaynağı hızlı bir şekilde belirleyebilirsiniz ve düzeltmeler yeni hatalara yol açmaz.
  2. Bağlantı sayısını en aza indirin. Bu, farklı modülleri birkaç geliştiriciye dış kaynak sağlayarak geliştirmeyi basitleştirecektir. Veya her bloğu diğerlerinden bağımsız olarak bağımsız olarak tasarlayabilirsiniz, bu da zamandan ve emekten tasarruf sağlar.
  3. Net bir kalıtım çizgisi olan bir hiyerarşi oluşturun. Test daha kolay olduğundan ve sonuçlar daha bilgilendirici olduğundan bu, kodun güvenilirliğini artırır.

Büyük projelerde modülerlik ilkesine uyulması zaman kazandıracak ve başlangıç ​​coşkusunu boşa çıkarmaz. Ayrıca, sonunda en ilginç olana, yani koddaki orijinal fikirlerin uygulanmasına odaklanabileceksiniz. Ama bu tam olarak her birimizin programlamada aradığı şeydir.

Öyle oldu ki, bir zamanlar kan ve terden ibaret olan bu paradigmalar, geleneksel yöntemlerin taraftarları sürüsü aracılığıyla dünyaya yayılmıştır. Bu paradigmalar programlamanın şafağında ortaya çıktı ve neden ortaya çıktıklarını, hangi avantajları sağladıklarını ve neden hala kullanıldıklarını herhangi bir geliştiricinin bilmesi için yararlıdır.

TAMAM. Giriş çok eğlenceli, ama yine de okumuyorsunuz, bu yüzden ilgilenen herkes - kedinin altına hoş geldiniz!

Zorunlu programlama



Tarihsel olarak, programladığımız bilgi işlem teknolojisinin büyük çoğunluğunun bir durumu vardır ve talimatlarla programlanmıştır, bu nedenle ilk programlama dilleri çoğunlukla tamamen zorunludur, yani. zorunluluk dışında herhangi bir paradigmayı desteklemedi.

Bunlar makine kodları, montaj dilleri ve Fortran gibi erken dönem yüksek seviyeli dillerdi.

Anahtar noktaları:

Bu paradigmada hesaplamalar, programın durumunu adım adım değiştiren talimatlar olarak tanımlanır.

Düşük seviyeli dillerde (birleştirme dili gibi), durum bellek, kayıtlar ve bayraklar olabilir ve talimatlar, hedef işlemci tarafından desteklenen talimatlardır.

Daha yüksek seviyedekilerde (C gibi), durum sadece hafızadır, talimatlar daha karmaşık olabilir ve çalışmaları sırasında hafıza tahsisine ve yeniden tahsise neden olabilir.

Çok yüksek düzeyde (Python gibi, zorunlu olarak programlarsanız), durum yalnızca değişkenlerle sınırlıdır ve talimatlar, montajcıda yüzlerce satır alacak karmaşık işlemler olabilir.

Temel konseptler:

- Talimat
- Durum

Oluşturulan kavramlar:

- Atama
- Geçiş
- Hafıza
- Işaretçi

Ana olarak:
- Montaj dilleri
- Fortran
- Algol
- Kobol
- Pascal
- C
- C++
- Ada
Yardımcı olarak:
- Python
- Yakut
- Java
- C #
-PHP
- Haskell (monadlar aracılığıyla)

Çoğu modern dilin zorunlu programlamayı bir dereceye kadar desteklediğini belirtmekte fayda var. Tamamen işlevsel Haskell bile zorunlu olarak yazılabilir.

Yapılandırılmış programlama



Yapılandırılmış programlama, programlamanın geliştirilmesinde ilk büyük adım olan bir programlama paradigmasıdır (aynı zamanda ortak bir tanım - geliştirme metodolojisi).

Yapılandırılmış programlamanın kurucuları E. Dijkstra ve N. Wirth gibi ünlü kişilerdi.

Bu paradigmada öncü diller Fortran, Algol ve B idi, daha sonra halefleri Pascal ve C idi.

Anahtar noktaları:

Bu paradigma, yaygın olarak kullanılan zorunlu kodlama kalıplarını birleştiren yeni kavramlar sunar.

Yapılandırılmış programlamada hala durum ve talimatlar üzerinde çalışırız, ancak bileşik talimat (blok), dal talimatları ve bir döngü kavramı tanıtılır.

Bu basit değişikliklerle, çoğu durumda kodu basitleştiren goto deyimini bırakmak mümkündür.

Bazen goto, rakiplerinin tüm iddialarına rağmen hala yaygın olarak kullanıldığı için kodu daha okunaklı hale getirir.

Temel konseptler:

- Engellemek
- Çevrim
- Dallanma

Bu paradigmayı destekleyen diller:

Ana olarak:
- C
- Pascal
- Temel
Yardımcı olarak:
- C #
- Java
- Python
- Yakut
- JavaScript

Kısmen desteklenir:
- Bazı makro derleyiciler (makrolar aracılığıyla)

Yine, çoğu modern dil yapısal bir paradigmayı destekler.

prosedürel programlama



Yine, yazılımın artan karmaşıklığı, programcıları hesaplamayı tanımlamanın başka yollarını aramaya zorladı.

Aslında, bir kez daha ek kavramlar tanıtıldı, bu da programlamaya yeni bir bakış açısı getirmeyi mümkün kıldı.

Bu seferki konsept prosedürdü.

Sonuç olarak, bugün hala memnuniyetle karşılanan program yazmak için yeni bir metodoloji ortaya çıktı - orijinal problem daha küçük problemlere bölündü (prosedürler kullanılarak) ve bu, tüm spesifik prosedürlerin çözümü önemsiz olana kadar devam ediyor.

Anahtar noktaları:

Prosedür, tek bir talimat olarak yürütülebilen bağımsız bir kod parçasıdır.

Modern programlamada, bir prosedür birden çok çıkış noktasına (C benzeri dillerde dönüş), birden çok giriş noktasına (Python'da verim veya C++'da statik yerel değişkenler kullanarak), argümanlara sahip olabilir, yürütülmesinin bir sonucu olarak bir değer döndürebilir , miktar veya parametre türü ve çok daha fazlası aşırı yüklenebilir.

Temel konseptler:

- Prosedür

Oluşturulan kavramlar:

- Telefon etmek
- Argümanlar
- Dönüş
- Özyineleme
- Aşırı yükleme

Bu paradigmayı destekleyen diller:

Ana olarak:
- C
- C++
- Pascal
- Nesne Pascal
Yardımcı olarak:
- C #
- Java
- Yakut
- Python
- JavaScript

Kısmen desteklenir:
- Erken Temel

Tüm bu dillerden birden fazla giriş noktasının yalnızca Python'da desteklendiğini belirtmekte fayda var.

Modüler programlama



Zaman zaman, programların artan karmaşıklığı, geliştiricileri kodlarını bölmeye zorladı. Bu sefer prosedürler yeterli değildi ve bu sefer yeni bir kavram tanıtıldı - modül.

İleriye baktığımda, modüllerin de yazılımın artan karmaşıklığını inanılmaz bir hızla içeremediğini ve daha sonra paketlerin ortaya çıktığını (bu aynı zamanda modüler programlamadır), sınıfların (bu OOP'dir), şablonların (genel programlama) ortaya çıktığını söyleyeceğim. .

Modüler programlama tarzında açıklanan bir program, bir modüller topluluğudur. İçeride ne olduğu, sınıflar, zorunlu kod veya saf işlevler önemli değil.

Modüller sayesinde, programlamada ilk kez, ciddi bir kapsülleme ortaya çıktı - bir modülün içindeki herhangi bir varlığı kullanmak, ancak bunları dış dünyaya göstermemek mümkündür.

Anahtar noktaları:

Modül, işlevsellik açısından benzer olan diğer yazılım birimlerini birleştiren bir programın ayrı bir adlandırılmış varlığıdır.

Örneğin, bir List sınıfı içeren bir List.mod dosyası
ve onunla çalışmak için işlevler - bir modül.

Şekil, Dikdörtgen ve Üçgen modüllerini içeren Geometri klasörü de bir modüldür, ancak bazı diller bir modül ve bir paket kavramını paylaşmaktadır (bu tür dillerde bir paket, bir modüller kümesi ve / veya bir dizi başka pakettir) ).

Modüller, içlerinde belirtilen varlıkları kullanmak için içe aktarılabilir (bağlanabilir).

Temel konseptler:

- Modül
- İçe aktarmak

Oluşturulan kavramlar:

- Naylon poşet
- Kapsülleme

Bu paradigmayı destekleyen diller:

Ana olarak:
- Haskell
- Pascal
- Python
Yardımcı olarak:
- Java
- C #
- ActionScript 3

Kısmen desteklenir:
- C / C++

Bazı dillerde modüller için ayrı soyutlamalar bulunurken, diğerleri modülleri uygulamak için başlık dosyalarını (C/C++), ad alanlarını, statik sınıfları ve/veya dinamik bağlantı kitaplıklarını kullanabilir.

Sonuç yerine

Bu yazıda şu anda popüler olan nesne yönelimli, genel ve işlevsel programlamayı anlatmadım. Sırf bu konuda oldukça radikal bir fikrim olduğu ve holivar yetiştirmek istemediğim için. En azından şimdilik. Konu topluluk için faydalı olursa, bu paradigmaların her birinin temellerini ayrıntılı olarak ortaya koyan birkaç makale yazmayı planlıyorum.

Ayrıca, otomat, uygulamalı, görünüş / aracı / bileşen tabanlı programlama gibi egzotik paradigmalar hakkında hiçbir şey yazmadım. Yazıyı çok büyütmek istemedim ve yine konu rağbet görürse bu paradigmalar hakkında muhtemelen daha detaylı ve kod örnekleriyle yazacağım.

Yapılandırılmış programlama

Yapılandırılmış programlamanın en yaygın olarak bilinen tanımı, kontrolü bir programa aktarmak için üç yapı kullanan bir programlama yaklaşımıdır: takip et, seç ve döngü yap.

Boehm ve Jacopini'nin yapılandırılmış programlama konusundaki klasik teoremi, herhangi bir doğru programın (yani, bir giriş ve bir çıkışa sahip, döngüler ve erişilemeyen dallar olmayan bir program) aşağıdaki mantıksal yapılar kullanılarak yazılabileceğini belirtir:

iki veya daha fazla operatörün dizileri;

ikili seçim;

tekrarlama;

Dijkstra, koşulsuz atlama operatörünü terk etmeyi ve kendimizi üç yapıyla sınırlandırmayı önerdi - bir dizi, bir seçim ve bir döngü;

Donald Knuth, koşulsuz atlama operatörünün yararlı olduğu durumları gösterdi (örneğin, birkaç iç içe döngüden çıkmak) ve Dijkstra'nın ifadesini eleştirdi.

1965 yılında Akademisyen Glushkov, yapılandırılmış programların bazı cebirlerde formüller olarak görülebileceğine dikkat çekti. Böyle bir cebirde ifadeleri dönüştürme kurallarını bilerek, derin resmi (ve dolayısıyla otomatikleştirilmiş) program dönüşümleri gerçekleştirilebilir.

Yapılandırılmış programlama- başlı başına bir amaç değil, asıl amacı iyi bir program elde etmektir. Bununla birlikte, en iyi programda bile, örneğin birçok iç içe döngüden çıkarken dal ifadeleri gereklidir.

Modüler programlama

Modüler programlama, tüm programın, her biri kendi kontrollü boyutuna, açık amacına ve dış ortamla ayrıntılı arayüzüne sahip modül adı verilen bir bileşen grubuna bölündüğü bir programlama yöntemidir. Modülerliğe tek alternatif, elbette elverişsiz olan monolitik bir programdır. Bu nedenle, modülerlik çalışmasındaki en ilginç soru, modüllere ayırma kriterinin tanımıdır. Modüler programlamanın arkasında üç ana kavram vardır.

Bilgi saklama ilkesi... Her bileşen tek bir tasarım çözümünü gizler, yani modül bilgiyi gizlemeye yarar. Yazılım geliştirme yaklaşımı, öncelikle yapılması özellikle zor olan veya değişmesi muhtemel tasarım kararlarının bir listesini oluşturmaktır. Ardından, her biri belirtilen çözümlerden birini uygulayan ayrı modüller tanımlanır.

modülerlik aksiyomu... Modül, bir programın belirli bir işlevini yerine getirmeye ve programın geri kalanıyla iletişim kurmaya hizmet eden bağımsız bir yazılım birimidir. Bir yazılım öğesi aşağıdaki koşulları karşılamalıdır:


- organizasyonun blokajı, yani. herhangi bir iç içe yerleştirme derecesindeki bloklardan bir program birimini çağırma yeteneği;

- sözdizimsel izolasyon, yani metindeki bir modülün sözdizimsel öğelerle tahsisi;

- anlamsal bağımsızlık, yani program biriminin çağrıldığı yerden bağımsızlık;

- verilerin ortaklığı, yani her aramada saklanan kendi verilerinin varlığı;

- tanımın eksiksizliği, yani program biriminin bağımsızlığı.

Montaj programlama... Modüller, bir programın oluşturulduğu yazılım tuğlalarıdır.

Kaplin modülleri Bir modülün diğer modüllerden göreceli bağımsızlığının bir ölçüsüdür. Bağımsız modüller, diğer modüller üzerinde yeniden çalışılmadan değiştirilebilir. Modülün yapışması ne kadar zayıfsa, o kadar iyidir. Farklı debriyaj türlerine bir göz atalım.

- bağımsız modüller idealdir. Modüller birbirleri hakkında hiçbir şey bilmezler. Arayüzlerini bilerek ve bir modülün çıktısını diğerinin girişine uygun şekilde yeniden yönlendirerek bu tür modüllerin etkileşimini düzenleyebilirsiniz.

- veri ile birleştirme (parametrik) - bu, verilerin bir modüle parametrelerinin değerleri olarak iletilmesi veya belirli bir işlevi hesaplamak için başka bir modüle çağrılmasının bir sonucu olarak iletilmesidir. Bu tür zincirleme, programlama dillerinde işlevlere (prosedürlere) atıfta bulunulduğunda uygulanır.

Bir modülün rutini, modülün önceki çağrılardan (arka plandan) bağımsız olmasıdır. Bir modül, çalışmasının sonucu yalnızca geçirilen parametre sayısına (çağrıların sayısına değil) bağlıysa rutindir. Çoğu durumda bir modül rutin olmalıdır, ancak bir modülün geçmişi tutması gereken durumlar da vardır. Bir modül için rutin derecesini seçerken üç öneri kullanılır:

- çoğu durumda modülü rutin hale getiriyoruz;

- geçmişe bağlı modüller yalnızca veri birleştirme için gerekli olduğunda kullanılmalıdır;

- geçmişe bağlı bir modülün belirtimi, kullanıcıların böyle bir modülün davranışını tahmin edebilmesi için bu bağımlılığı açıkça belirtmelidir.

Modül Programın ayrı bir parçası olarak tasarlanmış, mantıksal olarak ilişkili parçaların bir dizisidir.

Modül aşağıdaki gereksinimlere sahiptir:

1) modül tek bir işlevi yerine getirmelidir, yani bir modül oluştururken konsept kullanılır: "bir modül - bir işlev". Bu nedenle modül, bağımsız bir görevi yerine getiren bir program öğesidir. Girişinde, belirli bir başlangıç ​​verisi seti alabilir, bunları belirli bir algoritmaya göre işleyebilir ve işlem sonucunu döndürebilir, yani. standart halka arz ilkesi (Giriş - Süreç - Çıkış) uygulanmaktadır - girdi-süreç-çıktı;

2) modül, adı kullanılarak referans gösterilmelidir. Modülün kapanmasını garanti eden ve programların bakımını basitleştiren bir giriş ve bir çıkışa sahip olmalıdır;

3) modül işlevsel bütünlüğe sahip olmalıdır, yani. başlatılan işlemeyi tamamlamak için yeterli, her bir işlevin tam olarak uygulanması için düzenlenmiş işlemlerin bir listesini yürütmek;

4) modül, kontrolü çağırdığı noktaya geri getirmeli, sırayla diğer modülleri de çağırabilmelidir;

5) modül, çağrılarının geçmişini kaydetmemeli ve işleyişi sırasında kullanmamalıdır;

6) modül mantıksal bağımsızlığa sahip olmalıdır, yani. program modülünün çalışmasının sonucu yalnızca ilk verilere bağlıdır, ancak diğer modüllerin çalışmasına bağlı değildir;

7) modül diğer yazılım modülleri ile zayıf bilgi bağlantılarına sahip olmalıdır - modüller arasındaki bilgi alışverişi mümkün olduğunca en aza indirilmelidir;

8) modül nispeten küçük olmalıdır, yani. boyut ve karmaşıklık olarak görünür olun. Deneyimli programcılar, bir yazıcıda çıktının iki sayfadan fazla olmamasını tavsiye eder.

Modül bağımsızlığını elde etmek için genellikle kullanılır bilgi yerelleştirme ilkesi , veri yapısı hakkındaki tüm bilgilerin, fonksiyonların prototipleri, sabitler vb. ayrı bir modülde yoğunlaşır ("gizler"). Bu bilgilere erişim yalnızca bu modül aracılığıyla gerçekleştirilir (algoritmik C / C ++ dilinde, bu tür modüller * .h uzantısına sahiptir).

Modülleri kullanarak programlama denir modüler programlama XX yüzyılın 60'larının başında ortaya çıktı. Modüler programlama, tüm problem veya görev kompleksi görevlere, alt görevlere bölündüğünde, özetlendiğinde ve birlikte oluşturulan yazılımı temsil eden birbirine bağlı modüllerin hiyerarşik bir ağacı şeklinde sunulduğunda, soyutlama seviyelerini kullanma fikrine dayanır. (yazılım).

Modüler programlamanın faydaları takip ediliyor:


· Büyük bir program aynı anda birkaç programcı tarafından yazılabilir, bu da görevi daha erken bitirmenizi sağlar;

· En yaygın modüllerin kitaplıklarını oluşturabilirsiniz;

· RAM'e segmentasyon gerektiren büyük bir program yükleme prosedürünü basitleştirir;

· Projede hata ayıklamak için birçok doğal kontrol noktası vardır;

· Programları tasarlamak ve daha fazla değiştirmek daha kolay.

Modüler programlamanın dezavantajları aşağıdaki gibidir:

· Gerekli RAM'in boyutu artar;

· Derleme ve yükleme süreleri artar;

· Program yürütme süresi artar;

· Modüller arası arayüzler oldukça karmaşık hale gelir.

Modüler programlama, modüller - fonksiyonlar aracılığıyla gerçekleştirilir. İşlev Belirli bir görevi gerçekleştirmek için tasarlanmış program kodunu depolamak için ayrılmış bir bellek alanıdır. Başka bir deyişle, bir işlev, bir C/C++ programının minimum yürütülebilir modülüdür. Varsayılan olarak, işlev harici tiptedir ve herhangi bir program dosyasından erişilebilir. Ancak statik depolama sınıfı belirteci tarafından sınırlandırılabilir.

Bir işlev, türü, işlevle ilişkili adın kapsamı, işlev adının görünürlüğü ve bağlama türü ile karakterize edilir.

işlev_adı yazın (parametre_özelliği) işlev_gövdesi

Bir çeşit void dahil (dizi veya işlev türleri hariç) işlevin dönüş değerinin türü. Varsayılan int'dir. İşlevin dönüş türü void değilse, işlev gövdesi en az bir dönüş ifadesi içermelidir.

Fonksiyon adı- işleve başvurabileceğiniz tanımlayıcı. Programcı tarafından keyfi olarak seçilir ve hizmet sözcükleriyle ve diğer program nesnelerinin adlarıyla çakışmamalıdır. Ancak, herhangi bir C / C ++ programında en az bir işlev adlandırılmış olmalıdır. ana - programa giriş noktasını içeren ana işlev .

parametre_spec- resmi parametrelerin bir listesi, yani. çağrıldığında fonksiyona geçirilen değerleri alan değişkenler. Resmi parametrelerin listesi virgülle ayrılır. Her resmi parametre aşağıdaki biçime sahip olmalıdır:

formal_parameter_name yazın

Tür yerleşik (int, uzun, kayan nokta, çift, vb.), yapı (yapı), birlik (birlik), numaralandırma (enum), bunlara veya işlevlere veya sınıflara (sınıf) işaretçiler olabilir. Formal_parameter_name, işlevin gövdesinde kullanılan değişkenin adıdır. Resmi parametre tanımlayıcıları, işlev gövdesi içinde bildirilen yerel değişkenlerin adlarıyla eşleşemez.

Resmi bir parametre bildirimi, bir başlatıcı, yani parametre için bir başlangıç ​​değeri sağlaması gereken bir ifade içerebilir. Parametre başlatıcı sabit bir ifade değil. Parametrelerin ilk başlatılması, derleme aşamasında (örneğin, diziler için bellek ayırma gibi) değil, doğrudan programın yürütülmesi sırasında gerçekleşir.

C / C ++ dilinde işlevlere izin verilir, işlevin derlenmesi sırasında parametre sayısı sabit değildir, bu nedenle türleri bilinmemektedir. Bu tür işlevlerin parametrelerinin sayısı ve türleri, yalnızca gerçek parametreler listesi açıkça belirtildiğinde, çağrıldıklarında bilinir hale gelir. Bu tür işlevleri belirsiz uzunluktaki parametre listeleriyle tanımlarken ve tanımlarken, biçimsel parametrelerin belirtilmesi virgül ve üç nokta ile sonlandırılmalıdır.

Değişken sayıda parametreye sahip her fonksiyon, en az bir gerekli parametreye sahip olmalıdır. Gerekli parametreler listesinden sonra, bir virgül konur ve ardından derleyiciye bir işlev çağrısını işlerken parametre sayısı ve türleri arasındaki yazışmaların daha fazla kontrolünü gerçekleştirmeye gerek olmadığını bildiren bir üç nokta konur.

parametre_özelliği olmayabilir, yani parantezler boş olabilir, ancak bu durumda void tipinin belirtilmesi önerilir. .

fonksiyon-gövde- fonksiyon tanımının küme parantezleri ile sınırlandırılan ve fonksiyon başlığından hemen sonra yerleştirilen kısmı. İşlev gövdesi, bir bileşik ifade veya bir blok olabilir. Örneğin.