rat oreille gauche: Quelle est la nature de la programmation?

Cliquez sur l'attention InfoQ , Haut du public No.

Petit-déjeuner recevant les programmeurs techniques

Auteur | Chen Hao

Modifier | Ash

Savoir, je sais pourquoi. Comprendre la nature de la programmation, vous aider à devenir un programmeur plus efficace et mieux.

Cet article est tiré de Chen Hao (de gauche de la souris de l'oreille) frais annuels à partir de la colonne de temps geeks Application / applet « oreille gauche écoute au vent », est autorisée. Plus série de produits secs « paradigme de programmation Voyages », s'il vous plaît abonnez-vous à scanner le code à deux dimensions colonnes de lecture (supports de paiement micro-canal), abonnement annuel 199 yuans, les nouveaux utilisateurs de 30 yuans.

Il y a quelque temps, je l'ai écrit une série d'articles de programmation Voyage de paradigme, il y a beaucoup de lecteurs ont un message pour discuter des sujets connexes, ainsi que les commentaires des lecteurs exprimé leur intérêt à ce sujet, je l'espère, je peux recommander des matériaux d'apprentissage. Le contenu de base sera dans ma colonne de temps de geek, « oreille gauche écoute au vent » et de partager avec vous.

Inscrivez-vous pour scanner le code à deux dimensions « oreille gauche écoute au vent. »

Nous parlons d'une grande variété de paradigmes de programmation dans des langues différentes, des génériques du langage C, C ++ parlé de génériques, et a ensuite parlé de la carte fonctionnelle / Réduire / filtre et d'un pipeline et décorateur, ainsi que orientée objet en se basant sur les interfaces multi-états et le mode de transition ne sont pas mis en uvre, le mode politique et le mode proxy et IoC orienté objet, ainsi que la programmation prototype JavaScript lors de l'exécution pour modifier un prototype d'objet, et le mode confié Go langue ......

Tout cela, je ne sais pas si vous voyez quelques indices, dont certains sont communs ou à venir?

deux documents

En 1976, l'informaticien suisse, Algol W, Modula, Oberon et Pascal concepteur du langage Niklaus Emil Wirth a écrit un livre très classique "Algorithmes + Structures de données = Programmes" (lien pour l'édition 1985), cet algorithme + structure de données = programme.

Ce livre est écrit principalement la relation entre les algorithmes et structures de données, l'impact du livre sur la science informatique est très loin, en particulier dans l'enseignement des sciences informatiques.

En 1979, le logicien britannique et informaticien Robert Kowalski a publié l'algorithme = Logic + Contrôle et développement majeur « programmation logique » travaux connexes.

Robert Kowalski était un logicien et informaticien de fin des années 1970 aux années 1980, travaillant sur la base de données, et en utilisant un ordinateur pour prouver des succès importants sur l'application de l'année théorèmes mathématiques, en particulier dans la logique, le contrôle et les algorithmes proposés sa théorie révolutionnaire, fortement influencé les bases de données, langages de programmation, intelligence artificielle jusqu'à aujourd'hui.

Robert Kowalski mentionné dans cette thèse:

Un algorithme peut être considéré comme étant d'un composant logique qui spécifie les connaissances à utiliser dans la résolution des problèmes, et un élément de commande, qui détermine les stratégies de résolution de problèmes par des moyens dont cette connaissance est utilisée. La composante logique détermine le sens de l'algorithme alors que la composante de contrôle n'affecte son efficacité. l'efficacité d'un algorithme peut souvent être améliorée en améliorant la composante de commande sans changer la logique de l'algorithme. Nous soutenons que les programmes informatiques seraient plus souvent correct et plus facilement améliorés et modifiés si leurs aspects logiques et de contrôle ont été identifiés et séparés dans le texte du programme.

sens Traduit est probablement:

Tout algorithme aura deux parties, une partie est logique, qui est utilisé pour résoudre des problèmes pratiques. Le contrôle est une autre partie, qui sert à déterminer quelles stratégies pour résoudre le problème. La logique fait partie de l'algorithme pour résoudre le problème dans le vrai sens et la section de contrôle affectent uniquement l'efficacité de la résolution de ce problème. La logique et l'efficacité de l'exécution du programme est en fait pas liés. Nous croyons que si la partie séparée de manière efficace et logique de contrôle, le code serait plus facile d'améliorer et de maintenir.

Notez que la dernière phrase est la clé - si la partie séparée efficacement logique et de contrôle, le code serait plus facile d'améliorer et de maintenir.

La nature de la programmation

Deux vieux homme deux expressions:

  • Programmes = Algorithmes + Structures de données

  • = Algorithme logique + contrôle

La première expression tend structures de données et algorithmes, il tente de diviser les deux, les deux au début d'emprunter cette voie. Ils croient que si les structures de données bien conçu, les algorithmes deviennent simples, et un bon algorithme d'usage général devraient être utilisés sur les différentes structures de données.

La deuxième expression est d'exprimer la structure de données ne sont pas compliquées, les algorithmes sont complexes, c'est notre logique métier est complexe. Notre algorithme est constitué de deux éléments logiques, une véritable logique métier, l'autre est la logique de commande. Il existe deux procédures dans le code, est le vrai code logique métier, un autre code est le code de contrôle de notre programme, appelé code de contrôle, ce n'est pas la logique métier, la logique métier ne se soucient pas de cette chose.

L'efficacité de l'algorithme peut souvent être obtenue en augmentant l'efficacité de la section de contrôle, sans changer la partie logique, ce qui signifie qu'il n'y a pas besoin de changer l'algorithme. Par exemple factoriel: X (n)! = X (n) X (n-1) X (n-2) X (n-3) ... 32 1. partie logique factorielle pour définir: 1) est la factorielle de 0 à 1; 2) Si v est la factorielle de x et u = v (x + 1), alors u est égal à x + 1 factoriel.

Avec cette définition, à la fois vers le bas pour la factorielle x + 1 est réduite de la première à la factorielle de x, en multipliant le résultat par le résultat 1 (récursive, récursif), peut être calculé un par un d'une série de factorielle inférieure ( itération, déplacement).

Il est utilisé pour décrire la façon dont la section logique de commande. La plus vue rapide peut être considéré comme des stratégies de résolution de problèmes « contrôle », sans changer le sens de l'algorithme, car le sens de l'algorithme est déterminé par la logique. Sur la même logique, l'utilisation de différents contrôle, l'algorithme résultant est essentiellement équivalent, parce qu'ils répondent aux mêmes problèmes et les mêmes résultats.

Par conséquent, nous pouvons, grâce à l'analyse logique, afin d'améliorer l'efficacité de l'algorithme, pour maintenir sa logique, et de mieux utiliser cette logique. Par exemple, le contrôle peut remplacer descendante efficacité ascendante peut être améliorée. Et l'ordre de haut en bas pour effectuer l'exécution en parallèle, permettra d'améliorer l'efficacité.

Bref, ces deux expressions, nous pouvons conclure:

Programme = Logique + Ctrl + Structure de données

Prenant la parole devant tant de paradigmes de programmation, ou les méthodes de programmation. En fait, nous sommes tous autour de ces trois choses à faire. Par exemple:

  • Carte / Réduire la programmation fonctionnelle / filtre, qui est une sorte de contrôle. La logique de l'expression lambda est transmise au module de commande est que nous voulons résoudre les problèmes, qui font ensemble jusqu'à un algorithme. Enfin, je puis mettre les données dans une structure de données pour le traitement et éventuellement devenu notre programme.

  • Annuler comme l'exemple de notre modèle de commission comme la langue Go. Annuler cette question est le problème que nous voulons résoudre, il est logique, mais le processus d'annulation est contrôlé.

  • Comme nous sommes dépendants de l'interface orientée objet, plutôt que de mettre en uvre la même interface est une abstraction logique de la logique réelle dans les différentes classes de béton, est réalisée par la commande d'injection polymorphe ou de la dépendance de ces données dans des situations différentes différents sous traitement.

Si vous combinez attentivement avant de parler d'une grande variété de paradigmes de programmation pour penser à ces concepts, alors vous vous sentirez que toutes les langues ou paradigmes de programmation pour résoudre ces problèmes ci-dessus. Ce qui suit ces choses.

  • Le contrôle peut être normalisée. Par exemple: à travers les données, trouver des données, multi-thread, simultanées, asynchrones, etc., tout cela peut être standardisé.

  • Parce que le contrôle pour traiter des données, la standardisation de contrôle, doivent être normalisées Structure de données, nous pouvons résoudre cette question par la programmation générique.

  • Le contrôle a dû faire face à la logique métier, à savoir la logique de l'utilisateur. Ainsi, nous pouvons être fait par une interface / protocole standardisé, notre mode de contrôle peut être adapté à toute logique.

Ce qui précède trois points, il est l'essence même du paradigme de programmation.

  • En effet séparés logique, de contrôle et de données est la clé pour écrire un bon programme!

  • En effet séparés logique, de contrôle et de données est la clé pour écrire un bon programme!

  • En effet séparés logique, de contrôle et de données est la clé pour écrire un bon programme!

Nous écrire du code qui verra beaucoup de ce code contrôlera la logique et la logique métier sur un morceau. Il y a des variables et des processus avec aux entreprises, dont certains ne sont pas pertinentes. La logique métier détermine la complexité du programme, la logique métier est complexe, vous ne pouvez pas écrire un code simple.

Logic, qui est la limite inférieure de la complexité du programme, nous avons des procédures de contrôle, le besoin de venir avec beaucoup de codes de contrôle, si entrelacée Logic + contrôle est devenu la complexité du programme final.

La logique de commande de confusion exemplaire et

Nous regardons un exemple, voici ce que je fais sur leetcode une question, c'est un caractère générique correspondant, deux chaînes correspondent. Les exigences sont les suivantes:

correspondant Wildcard isMatch ( "aa", "a") faux isMatch ( "aa", "aa") true isMatch ( "aaa", "aa") faux isMatch ( "aa", "*") true isMatch ( "aa", "a *") true isMatch ( "ab", "? *") true isMatch ( "AAB", "c * a * b") faux

Maintenant, vous me regardez écrire du code:

bool isMatch (const char * s, const char * p) {const char * last_s =; const char * last_p =; while (! * s = '\ 0') {if (* p == '*') {p ++ ; if (* p == '\ 0') return true; last_s = s; p = last_p;} else if ( '?' * p == || * s == * p) {s ++; p ++;} else si (last_s! =) {p = last_p; s = ++, les last_s} else {return false;}} while (* p == '*') p ++; retour * p == '\ 0';}

Je ne sais pas comment j'écris, il semble que pour passer, je dois me concentrer sur la performance, vous voyez, comment chaotique le code ci-dessus. Si je ne vous écris pas les commentaires que vous avez peut-être pas lu. Même après avoir écrit une note, vous osez changer? Vous pouvez même déplacer sans oser bouger (ha ha). Un grand nombre de ces codes qui ne sont pas au-dessus de la logique métier, le programme logique de contrôle est utilisé.

Il est logique de service relativement compliqué, la logique de commande avec la logique métier en croix, bien que le code est écrit en petit, mais ce code est assez compliqué. Après deux ou trois jours, je regarde en arrière, je l'ai écrit ce qui à la fin, je ne sais pas pourquoi j'écris ceci? Je me suis dit comment penser? Je ne sais pas. Je me sens maintenant.

Alors, comment mieux écrire du code qui fonctionne sur le dessus de celui-ci?

  • Tout d'abord, nous avons besoin d'une machine d'état plus générique (NFA, automates finis non-déterministe, ou DFA, automates finis déterministe) pour maintenir correspondre au début et à la fin de l'état. Il appartient au contrôle.

  • Si nous faisons bien, vous pouvez aussi abstraite d'un programme d'analyse de la grammaire comme les mêmes choses. Ce contrôle est.

  • Ensuite, nous faisons correspondre * et? Algorithme pour former différentes stratégies d'adaptation.

De cette façon, notre code deviendra une partie de la belle, mais aussi un certain nombre de rapide.

Il y a des papiers réguliers publiés algorithme efficace des expressions régulières Expression appropriées peuvent être trouvées simple et rapide, vous recommandons de lire, il sont liés à la mise en uvre, je ne dis pas ici.

https://swtch.com/~rsc/regexp/regexp1.html

Ici, l'essence du programme essaie de dire est logique + Ctrl + données, dont, la logique et le contrôle est la clé. Notez que cela et l'architecture du système avait quelque chose dans les espaces communs, la logique est votre logique métier, processus logique abstraite, ainsi que la définition d'une structure de données qui est représentée par la logique de contrôle à long terme avec votre logique métier est correct, vous le contrôlez exécuté .

Un mode de commande de déroulement du programme, à savoir un mode d'exécution, série ou parallèle, synchrone ou asynchrone, et le programme stockant la relation entre les différents chemins d'exécution ou des modules, les données et la logique métier n'a pas d'importance.

Si vous regardez les codes chaotiques, vous constaterez que le plus gros problème est que nous avons mis la logique étroitement liés et le contrôle, de sorte que le code conduira à très confus, difficile à maintenir, beaucoup de Bug. La raison en est que la grande majorité des questions de procédure complexe. Comme dans le cas de la peinture comme représenté sur la figure ci-dessous.

Encore une fois un exemple simple

Nous donnons ici un exemple simple.

Voici une information de forme commune pour vérifier le code de l'utilisateur, je crois que le code tel que vous voyez beaucoup plus.

fonction check_form_x {var name = $ ( '# name') val ;. si (== nom || name.length < = 3) {return {état: 1, un message: 'Nom invalide'};} mot de passe var = $ ( '# password') val; if (== || mot de passe password.length. < = 8) {return {status: 2, le message: 'mot de passe invalide'};} var repeat_password = $ ( '# repeat_password') val; if (repeat_password = password.length) {return {status:.! 3, un message: 'mot de passe et le mot de passe de répétition non-concordance'};} var email = $ ( 'email #') val; if (check_email_format (email)) {return {status :. 4, un message: 'email invalide'};} ... retour {status: 0, le message: 'OK'};}

Mais en fait, nous pouvons faire une connexion DSL + un analyseur DSL, par exemple:

var meta_create_user = {form_id: 'create_user', champs: <{id: 'name' tapez: 'text' min_length: 3} {id: 'password' tapez: 'mot de passe' min_length: 8} { id: 'répétition mot de passe' tapez: 'mot de passe' min_length: 8} {id: 'email' tapez: 'email'}>}; var r = check_form (meta_create_user);

Ainsi, la description de la technologie DSL est, et notre check_form « Logic » sont devenus « Control », le code est très beau.

résumé

Code des raisons de complexité:

  • La complexité de la logique de service détermine la complexité du code;

  • la complexité de la complexité + de la logique de contrôle de la logique de service == >  code de programme Confusion insupportable;

  • La cause profonde de la grande majorité des procédures sont compliquées et déroutantes: couplage logique métier et la logique de contrôle.

Comment séparer le contrôle et la logique de celui-ci? Nous pouvons utiliser ces techniques pour découpler ci-dessous.

  • machine d'état

    • Définitions d'état

    • Condition de transition État

    • état d'action

  • DSL - Langue spécifique Domaine

    • HTML, SQL, Unix Shell Script, AWK, expressions régulières ......

  • programmation paradigme

    • Orientée objet: la commission, stratégie, pont, modification, IoC / DIP, MVC ......

    • Programmation fonctionnelle: modifiée, tuyaux, assemblé

    • Dérivation programmation logique: Prolog

Telle est l'essence de la programmation:

  • La logique est la partie réelle d'un sens (Quoi?)

  • section de contrôle affectent uniquement l'efficacité d'une partie logique (Comment)

Ce qui suit est un répertoire « paradigme de programmation Travels » série, vous permettant d'obtenir une image complète du contenu de cette série. Cette série d'articles dans une grande quantité de code, il est réfléchi audio difficile, donc il n'y a pas d'enregistrement audio, mais regardez également la compréhension.

  • paradigme de programmation voyages (1) - Origins

  • Voyage de paradigme de programmation (2) - programmation générique.

  • Voyage de paradigme de programmation (3) - système de type générique et de la nature

  • Voyage de paradigme de programmation (4) - Programmation fonctionnelle

  • Voyage de paradigme de programmation (5) - Mode modifié

  • Voyage de paradigme de programmation (6) - programmation orientée objet

  • Voyage de paradigme de programmation (7) - paradigme de programmation basé sur un prototype

  • paradigme de programmation Voyages (8) - commandée par le mode Go langue

  • La nature de la programmation - paradigme programmation Voyages (9)

  • Voyage de paradigme de programmation (10) - Logique de programmation paradigme

  • paradigme de programmation Voyages (11) - programme dans le monde du paradigme de programmation

avantages exclusifs

Abonnez-vous maintenant, droits debout:

Avantages prix: ¥ 199 / an Temps de geeks une nouvelle inscription de l'utilisateur par ¥ 30

Avantages II: chaque inviter un ami à acheter, vous obtenez 36 yuans remise en argent maintenant, et de plus en plus invités aussi, ne pas le bouchon, le retrait immédiat.

Figure lecture de timbre sous le balayage de code d'origine ou deux dimensions, abonnez-vous instantanément!

texte recommandé aujourd'hui

Cliquez ci-dessous pour lire l'image

Les données de l'architecture distribuée du système classique

Je collectionnais mon IQOS manchon de protection Collect grande part
Précédent
« Négociateur » pour voir les larmes du public sont trop pas cher? Variété sensationnelle devrait être assez modérée
Prochain
190327 Li Yi Feng ouvert lunettes de coopération transfrontalière à 00h00 le 28 à la vente ouverte
« L'amour est incolore et inodore »: L'amour à la fin est quoi? Quel est le monde des adultes de l'amour?
Sur une « machine à godets » de l'auto-culture, Faets expérience du joueur M9 portable
« Le plus fort cerveau » Yin Guanqi être éliminé, l'esprit des garçons-pensants d'un gentilhomme, « combien terrible
Ce drame score cresson 2.8, pourquoi pouvons-nous réunis Zhang Yishan Lin Yongjian Wang Yan et d'autres acteurs célèbres
Jeter le cockpit, zone portuaire de Qingdao course d'un pilote automatique de camion Jiefang
« Elle vient » cette année BBC Channel Four a diffusé une réputation de bonne comédie
Lee aimerait juste faire la course de voiture électrique idéal plus il?
« Sont très bons » nounou Xiaocai réalité est une grande et belle, a joué dans beaucoup d'autres uvres classiques de gens ne pas rouge
« Sur le projectile cassé 3 » Quels sont les détails de l'exploitation minière vaut la peine? (Basse)
« Game of Thrones » à la fin qui est le dernier à monter sur le trône? Regardez analyser objectivement Odds étrangers
Aucune inquiétude de la gamme connue sous le nom de ONE fabrication idéal officiellement publié