Suite

Comment créer une nouvelle classe d'entités à partir d'un FC existant et d'une clause WHERE ?


J'ai une classe d'objets. Je veux copier le FC et utiliser une clause WHERE pour limiter les lignes copiées. J'ai essayé d'utiliser CopyFeatures_management mais cela génère une erreur sur leCopyFeatures_management()ligne.

Voici le code :

import arcpy arcpy.env.workspace = 'C:/… /localFile.gdb' inFC = 'inputFeatureClassName' outFC = 'tmp_JUNK' arcpy.CopyFeatures_management(inFC, outFC, '"FIELD_NAME" = "VALUE"')

L'erreur renvoyée :

arcgisscripting.ExecuteError : échec de l'exécution. Les paramètres ne sont pas valides. ERREUR 000800 : la valeur n'est pas membre de | DEFAUTS | TEXT_UTF16 | MAX_FILE_SIZE_4 Go | MAX_FILE_SIZE_256 To | GEOMETRIE_OUTOFLINE | BLOB_OUTOFLINE | GEOMETRY_AND_BLOB_OUTOFLINE | TERRAIN_DEFAUTS | MOSAICDATASET_DEFAULTS | MOSAICDATASET_INLINE. Échec de l'exécution (CopyFeatures).

Des idées de ce que je fais mal et comment y remédier?

Mise à jour #1 - Ce code fonctionne mais je me demande si c'est vraiment la meilleure approche. Si je comprends cela, je crée une couche d'entités, effectue la sélection sur la couche d'entités, puis écris la sélection dans une nouvelle classe d'entités. Est-ce exact? Est-ce l'approche la plus efficace?

# Importer les modules système import arcpy from arcpy import env # Définir l'option d'écrasement arcpy.env.overwriteOutput = True # Mettre en erreur le trapping au cas où une erreur se produirait lors de l'exécution de l'outil, essayez : # Créer une couche à partir de la classe d'entités arcpy.MakeFeatureLayer_management("C :/… /localFile.gdb/tmp_FeatureClass","tmpOMG") arcpy.SelectLayerByAttribute_management("tmpOMG", "NEW_SELECTION", """"FIELD_NAME" = 'VALUE'""") # Écrire les entités sélectionnées dans une nouvelle classe d'entités arcpy.CopyFeatures_management("tmpOMG", "C:/… /localFile.gdb/tmpOutFromLayer") sauf : print arcpy.GetMessages()

source : Aide ArcGIS


Vous ne pouvez pas utiliser unclause_oùavec des fonctions de copie. En regardant la page d'aide, la syntaxe est (avec des paramètres facultatifs dans{}supports):

CopyFeatures_management (in_features, out_feature_class, {config_keyword}, ​​{spatial_grid_1}, {spatial_grid_2}, {spatial_grid_3})

Alors tu passes'"FIELD_NAME" = "VALUE"'en tant que config_keyword, ce qui le confond et provoque l'erreur. Vous ne pouvez limiter les entités copiées qu'en commençant par une sélection, et les sélections ne peuvent se produire que sur des calques (comme dans votre deuxième extrait).


J'utilise généralement classe d'objets à classe d'objets (arcpy.FeatureClassToFeatureClass_conversion), lequel pouvez accepter une clause where.

FeatureClassToFeatureClass_conversion (in_features, out_path, out_name, {where_clause}, {field_mapping}, {config_keyword})

C'est légèrement ennuyeux car vous devez spécifier à la fois l'espace de travail en sortie et le nom de la classe d'entités en sortie, et je ne sais pas pourquoi c'est le cas, mais voilà. C'est plus rapide queSelect_analysis(qui fait la même opération). Pour votre cas, le code serait quelque chose comme :

arcpy.FeatureClassToFeatureClass_conversion(inFC, outGDB, outFC, '"FIELD_NAME" = "VALUE"')

Comment ajouter une colonne à une grande table dans MySQL

Décharge de 5,5 Go. Notre PM a décidé d'y créer une nouvelle colonne pour effectuer une nouvelle fonctionnalité. La table est InnoDB alors ce que j'ai essayé:

Modifier la table à l'écran avec verrou de table. A pris

30 heures et rien. Alors je viens de l'arrêter. J'ai d'abord fait une erreur car je n'ai pas mis fin à toutes les transactions, mais la deuxième fois, il n'y avait pas de multiverrouillage. L'état était copier dans la table tmp.

Comme je dois également appliquer un partitionnement pour cette table, nous décidons de créer un vidage, de renommer et de créer une table avec le même nom et une nouvelle structure. Mais dump fait une copie stricte (au moins je n'ai pas trouvé autre chose). J'ai donc ajouté pour vider une nouvelle colonne avec sed et l'interroger. Mais d'étranges erreurs ont commencé. Je crois que cela a été causé par le jeu de caractères. La table en utf-8 et le fichier sont devenus us-ascii après sed . J'ai donc eu des erreurs (commande inconnue ''') sur 30% des données. C'est donc aussi une mauvaise façon.

Quelles sont les autres options pour accomplir cela et accélérer les performances (je peux le faire avec un script php, mais cela prendra des années). Quelles seront les performances de INSERT SELECT dans ce cas.


[Chemin] Surface 3D : ajoutez la fonction de sélection de visage(s) à l'algorithme Drop Cutter #2849

Nouvelle fonctionnalité pour limiter l'opération de surface 3D aux faces sélectionnées.

Désactivation de la fonctionnalité IgnoreWaste. Les modifications de code pour la nouvelle fonctionnalité de sélection de visage nécessiteront une nouvelle méthode pour maintenir IgnoreWaste fonctionnel. Par conséquent, elle est désactivée jusqu'à ce qu'elle puisse être retravaillée.
Traitement du visage amélioré

Corrections et améliorations supplémentaires

Nouvelle fonctionnalité : Éviter les visages ! C'est vrai. Ajoutez des faces à la fin de la liste Géométrie de base, puis définissez la nouvelle propriété, AvoidLastXFaces, pour indiquer à FreeCAD et 3D Surface d'éviter les dernières faces X de la liste Géométrie de base ! Tous les autres restants ci-dessus (en haut) seront COUPE, ou le reste du modèle entier si vous le souhaitez !

Ajout d'un motif de coupe circulaire.

Merci d'avoir créé une pull request pour contribuer à FreeCAD ! Pour faciliter l'intégration, veuillez confirmer les éléments suivants :

  • Branche rebasée sur le dernier maître git pull --rebase amont master
  • Tests unitaires confirmés en exécutant ./bin/FreeCAD --run-test 0
  • Le message d'engagement est bien écrit
  • Le message de validation inclut le problème #<id> ou les correctifs #<id> où <id> est l'identifiant du problème MantisBT associé s'il existe

Et n'oubliez pas de mettre à jour le Wiki avec les fonctionnalités ajoutées ou modifiées une fois ce PR fusionné.
Noter: Si vous n'avez pas d'accès au wiki, merci de mentionner votre contribution sur le fil de discussion 0.19 Changelog Forum.

Vocx-fc 29 déc. 2019

pass n'est pas nécessaire ici car la clause else n'est pas vide. Cela sera signalé par le vérificateur de code LGTM.

Russe4262 30 déc. 2019

Merci pour l'examen. J'ai corrigé cela dans un commit récent. J'apprécie l'implication, Monsieur.

Russe4262 a commenté le 13 janv. 2020

Je vais corriger l'édition complète de PathSurfaceGui.py. Je ne sais pas pourquoi il pense que j'ai changé tout le contenu. Je devrai peut-être supprimer ce PR et en créer un nouveau pour résoudre le problème.

Vocx-fc a commenté le 13 janv. 2020

Utilisez-vous git merge localement ?

Nous avons remarqué que les gars de Path ne savent pas comment rebaser correctement leurs branches. Ils se retrouvent toujours avec des tonnes de commits inutiles dans l'historique des commits.

Créez simplement une branche, validez vos modifications, puis git pull --rebase amont master .

Ou si votre branche master est déjà à jour

Russe4262 a commenté le 13 janv. 2020 •

Honnêtement, je ne connais pas grand-chose à Git. Je ne suis pas un codeur de métier - un professeur d'espagnol. En ce qui concerne "les gars de Path", je ne pense pas qu'il y en ait beaucoup, et je suis probablement celui qui salit l'historique des commits et en assumerai la responsabilité.
En bref, je vais résoudre ce problème et préparer un PR propre.
Merci pour vos conseils et votre aide à l'utilisation de Git. Je vous en suis reconnaissant. J'utilise GitKraken depuis environ un an. Ce dernier commit a été effectué sur un ordinateur distant, sans GitKraken, sur GitHub.com.
Je vais le réparer et le nettoyer.
Merci d'avoir contribué à l'examen du grand nombre de PR.
Passe une bonne aprés midi!

Vocx-fc a commenté le 13 janv. 2020

Ne t'inquiète pas. Dans le grand schéma des choses, ce n'est pas un gros problème, c'est juste quelque chose d'ennuyeux que vous savez que c'est mal mais c'est difficile à corriger. Comme tenir votre couteau avec la main gauche et la fourchette avec la main droite, c'est mal, mais les gens le font quand même.

Quoi qu'il en soit, si vous voulez en savoir plus sur Git, consultez la page wiki à ce sujet, Gestion du code source. Il est impossible de tout couvrir, mais j'espère que les bases sont suffisantes pour permettre aux nouveaux utilisateurs de démarrer. Évidemment, vous n'êtes pas un débutant, mais peut-être qu'en le lisant, vous obtenez des informations auxquelles vous n'aviez pas pensé auparavant.

Russe4262 a commenté le 23 janv. 2020

Je peux vous le dire maintenant, il échouera au test Python_Major_Version=2 TravisCI. J'ai utilisé une syntaxe de formatage de chaîne Python 3 f'<>'. Si les développeurs préfèrent, je les remplacerai par la syntaxe '<>'.format() qui est compatible avec Python 2. Merci de me le faire savoir. Merci.

Vocx-fc a commenté le 23 janv. 2020

J'ai remarqué que vous utilisiez des f-strings. Je préférerais utiliser l'ancien .format() .

Je ne pense pas que vous ayez besoin d'utiliser les dernières fonctionnalités de Python 3 simplement parce qu'elles existent. Bien que j'aie lu dans le forum des gens mentionnent que Path ne fonctionne déjà pas avec Python 2, alors peut-être que ce changement n'a plus d'importance.

Russe4262 a commenté le 23 janv. 2020

@vocx-fc
Oui Monsieur. Je les échangerai le lendemain environ, lorsque j'arriverai à mon terminal de développement. Je n'étais pas certain de savoir si nous voulions ou non maintenir la compatibilité avec Python 2. Je vais probablement écraser les commits et rebaser également. J'ai juste pensé que nous pourrions utiliser un petit dialogue dramatique dans notre historique de commit temporaire. Merci pour les commentaires.

Vocx-fc a commenté le 23 janv. 2020

Je pense que la position non officielle "officielle" est "maintenir la compatibilité Python 2 quand c'est facile à faire", par exemple, dans ce cas.

Russe4262 a commenté le 26 janv. 2020

@vocx-fc
La compatibilité Python 2 devrait être restaurée dans ce dernier cycle de commit, squash et rebase ce soir. La syntaxe f'' offensante de Py2 a été remplacée par l'ancienne syntaxe ''.format().

Vocx-fc a commenté le 12 mars 2020

Au fait, je ne connais pas bien le code de Path, mais je pense que ce fichier PathSurface.py devient énorme. Vous devriez essayer de le rendre beaucoup plus petit, en divisant le code en morceaux plus petits et en important ces morceaux (classes, fonctions) si nécessaire. C'est précisément ce que nous faisons dans Draft. Nous avons d'énormes fichiers monolithiques de 5000 lignes que nous devons vraiment séparer pour améliorer la lisibilité et la maintenance future du code.

Il semble que Path ait déjà une tonne de PathScripts , donc c'est bien. Si vous devez créer plus de sous-modules, n'ayez pas peur de le faire. Créez plus de dossiers sous PathScripts/ et placez le code là-bas. Python est assez flexible avec les importations, il ne sert donc à rien d'avoir des fichiers de plus de 500 lignes.

Russe4262 a commenté le 12 mars 2020

Merci pour les commentaires. La taille a attiré mon attention pendant le développement, je me suis concentré sur la fonctionnalité avec quelques restructurations en cours de route pour faciliter l'optimisation ultérieure, la maintenance et les améliorations de lisibilité. La meilleure façon d'aborder le problème n'a pas encore été clairement établie.

Je ne suis pas vraiment familier avec l'utilisation des classes en Python. J'ai plus d'expérience en PHP. Dans l'ensemble, je saisis le concept de classe (je l'utilise en PHP avec une certaine régularité), mais j'aurai besoin d'aide pour décomposer certaines de mes méthodes (fonctions) liées à l'objectif en classes autonomes tout en passant l'objet d'opération actif ( ou son proxy) à la nouvelle classe pour y accéder. Il y a quelques classes superposées en jeu et ce n'est toujours pas clair pour moi (c'est-à-dire quelle est la classe parente, qui hérite des autres, etc.). Néanmoins, je vais y travailler.

Je peux commencer par décomposer les méthodes de l'algorithme 'Waterline' dans un module séparé sans classe. je pense mes compétences en python et FreeCAD sont adéquates sinon, je vais chercher de l'aide. De plus, je devrai obtenir de l'aide pour configurer ma distribution Debian pour qu'elle soit construite à partir des sources. Je suis un utilisateur natif de Windows avec une exposition minimale basée sur Unix. Debian permettra principalement l'utilisation de CCache, si je comprends bien, pour permettre des compilations plus rapides à partir des sources après une compilation initiale.

Quoi qu'il en soit, je vais travailler sur le problème de taille mis en évidence ici.
Merci.

Vocx-fc a commenté le 12 mars 2020

Ça a l'air bien. Comme je l'ai dit, je n'ai pas examiné le code en détail, je ne peux donc pas donner de conseils spécifiques pour le moment. Cependant, ce que vous mentionnez a du sens.

Si le code est une grande classe, vous devez généralement conserver cette classe dans un seul fichier car les méthodes de classe accéderont aux attributs de classe, c'est-à-dire à toutes ces variables qui commencent par self .

Cependant, si vous avez des fonctions (méthodes) qui n'opèrent pas sur ces self.variables , vous pouvez les externaliser et les placer dans des modules séparés. Une autre façon est de passer les self.variables à la fonction externe et d'obtenir une nouvelle valeur.

Quant à l'héritage de classe. Vous pouvez définir une classe parente et l'utiliser dans votre classe actuelle. C'est simple à faire. Dans ce cas, les self.variables sont partagées entre la classe parent et la classe enfant. Votre classe principale serait l'enfant, tandis que les classes parentes (il pourrait y en avoir beaucoup) ne sont utilisées que pour stocker du code en excès, c'est-à-dire des fonctions supplémentaires.

Il existe d'autres façons de décomposer la classe principale, mais cette méthode, l'héritage simple, est probablement la plus simple.

En ce qui concerne l'utilisation de Debian et la compilation. La page Compiler sur Linux contient de bonnes informations pour Debian et Ubuntu. Cela ne devrait pas être un problème de compiler dans ces systèmes car ils sont bien testés par plusieurs développeurs. Je vous conseillerais d'éviter Fedora pour le moment car plusieurs utilisateurs ont signalé des problèmes avec.

Le ccache n'est vraiment utile que si vous compilez du code C++. Si vous développez principalement en Python, cela ne vous aidera pas beaucoup, car les fichiers sont essentiellement simplement copiés, ce qui prend très peu de temps. Mais bien sûr, il est bon de compiler le programme de temps en temps pour obtenir les dernières fonctionnalités écrites en C++, comme le système de base et également des ateliers comme Part, PartDesign et TechDraw.

Vocx-fc a commenté le 15 mars 2020

Salut, encore une autre suggestion, désolé.

J'ai remarqué que cette pull request consiste en un seul commit. Si vous n'ajoutez que quelques lignes de code, regrouper plusieurs commits en un seul est génial car vous ne polluez pas l'historique des commits. Cependant, si vous ajoutez des milliers de lignes de code, vous devriez probablement avoir des commits séparés pour différentes sections du code, ce qui facilite l'examen des modifications de manière incrémentielle, et les futurs développeurs comprendront comment ce fichier est né. Par exemple, puisque ce commit modifie 4 fichiers, il pourrait y avoir au moins 4 commits différents. Et comme le fichier PathSurface a beaucoup changé, il pourrait y avoir un commit pour chaque nouvelle méthode que vous avez ajoutée.

Je sais que cela semble ennuyeux, mais la gestion correcte de l'historique de Git donne un code facile à étudier par des personnes qui ne sont pas les auteurs originaux du code.

Au fait, je ne sais pas si vous avez commencé à écraser les commits parce que nous l'avons suggéré. Nous n'aurions peut-être pas dû le suggérer immédiatement. La vérité est que la gestion de l'historique des commits est un peu un art qui nécessite de la pratique. Vous pouvez jeter un œil à #3082 pour voir comment je l'ai fait. J'ai ajouté de nombreux petits commits, chacun d'entre eux touchant principalement un seul fichier, seuls quelques-uns modifient divers fichiers. L'idée est que quiconque veut regarder le code puisse voir l'évolution des changements, et pas seulement passer de 0 à 100 en un seul grand saut.

Pour produire quelque chose comme #3082, j'ai dû produire de nombreux petits commits, j'ai dû en écraser plusieurs, j'ai dû en diviser certains, j'ai dû réécrire le message de commit, changer l'ordre des commits, etc. tout est fait avec git rebase -i et avec quelques essais et erreurs pour voir ce qui fonctionne le mieux.


Contenu

Objective-C a été créé principalement par Brad Cox et Tom Love au début des années 1980 dans leur entreprise Productivity Products International (PPI). [5]

Avant la création de leur entreprise, tous deux avaient été initiés à Smalltalk alors qu'ils travaillaient au Centre de technologie de programmation d'ITT Corporation en 1981. Les premiers travaux sur Objective-C remontent à cette époque. [6] Cox était intrigué par les problèmes de véritable réutilisation dans la conception et la programmation de logiciels. Il s'est rendu compte qu'un langage comme Smalltalk serait inestimable dans la création d'environnements de développement pour les développeurs de systèmes chez ITT. Cependant, lui et Tom Love ont également reconnu que la rétrocompatibilité avec C était d'une importance cruciale dans le milieu de l'ingénierie des télécommunications d'ITT. [7]

Cox a commencé à écrire un préprocesseur pour C pour ajouter certaines des capacités de Smalltalk. Il eut bientôt une implémentation fonctionnelle d'une extension orientée objet du langage C, qu'il appela « OOPC » pour Object-Oriented Pre-Compiler. [8] Love a été embauché par Schlumberger Research en 1982 et a eu l'opportunité d'acquérir la première copie commerciale de Smalltalk-80, qui a influencé plus loin le développement de leur idée originale. Afin de démontrer que de réels progrès pouvaient être réalisés, Cox a montré que la réalisation de composants logiciels interchangeables ne nécessitait en réalité que quelques modifications pratiques des outils existants. Plus précisément, ils devaient prendre en charge les objets de manière flexible, être fournis avec un ensemble de bibliothèques utilisables et permettre au code (et à toutes les ressources nécessaires au code) d'être regroupés dans un format multiplateforme.

Love et Cox ont finalement formé PPI pour commercialiser leur produit, qui a couplé un compilateur Objective-C avec des bibliothèques de classes. En 1986, Cox a publié la description principale d'Objective-C sous sa forme originale dans le livre La programmation orientée objet, une approche évolutive. Bien qu'il ait pris soin de souligner que le problème de la réutilisabilité ne se limite pas à ce que fournit Objective-C, le langage s'est souvent trouvé comparé fonctionnalité pour fonctionnalité avec d'autres langages.

Popularisation via NeXT Edit

En 1988, NeXT a licencié Objective-C de StepStone (le nouveau nom de PPI, propriétaire de la marque Objective-C) et a étendu le compilateur GCC pour prendre en charge Objective-C. NeXT a développé les bibliothèques AppKit et Foundation Kit sur lesquelles l'interface utilisateur NeXTSTEP et Interface Builder étaient basés. Alors que les postes de travail NeXT n'ont pas eu un grand impact sur le marché, les outils ont été largement salués dans l'industrie. Cela a conduit NeXT à abandonner la production de matériel et à se concentrer sur les outils logiciels, en vendant NeXTSTEP (et OpenStep) comme plate-forme de programmation personnalisée.

Afin de contourner les termes de la GPL, NeXT avait initialement prévu d'expédier le frontend Objective-C séparément, permettant à l'utilisateur de le lier à GCC pour produire l'exécutable du compilateur. Bien qu'initialement accepté par Richard M. Stallman, ce plan a été rejeté après que Stallman ait consulté les avocats de GNU et que NeXT ait accepté d'intégrer Objective-C à GCC. [9]

Le travail pour étendre GCC a été dirigé par Steve Naroff, qui a rejoint NeXT de StepStone. Les modifications du compilateur ont été rendues disponibles selon les termes de la licence GPL, mais pas les bibliothèques d'exécution, rendant la contribution open source inutilisable pour le grand public. Cela a conduit d'autres parties à développer de telles bibliothèques d'exécution sous licence open source. Plus tard, Steve Naroff a également été le principal contributeur au travail chez Apple pour construire l'interface Objective-C de Clang.

Le projet GNU a commencé à travailler sur son implémentation logicielle libre de Cocoa, nommée GNUstep, basée sur la norme OpenStep. [10] Dennis Glatting a écrit le premier runtime GNU Objective-C en 1992. Le runtime GNU Objective-C, utilisé depuis 1993, est celui développé par Kresten Krab Thorup lorsqu'il était étudiant à l'université au Danemark. [ citation requise ] Thorup a également travaillé chez NeXT de 1993 à 1996. [11]

Développement Apple et Swift Edit

Après avoir acquis NeXT en 1996, Apple Computer a utilisé OpenStep dans son nouveau système d'exploitation, Mac OS X. Cela comprenait Objective-C, l'outil de développement basé sur Objective-C de NeXT, Project Builder, et son outil de conception d'interface, Interface Builder. Les deux ont ensuite été fusionnés en une seule application, Xcode. La plupart des API Cocoa actuelles d'Apple sont basées sur des objets d'interface OpenStep et constituent l'environnement Objective-C le plus important utilisé pour le développement actif.

Lors de la WWDC 2014, Apple a introduit un nouveau langage, Swift, qualifié d'« Objectif-C sans le C ».

Objective-C est une couche mince au-dessus de C et est un "super-ensemble strict" de C, ce qui signifie qu'il est possible de compiler n'importe quel programme C avec un compilateur Objective-C et d'inclure librement du code en langage C dans une classe Objective-C. [12] [13] [14] [15] [16] [17]

Objective-C tire sa syntaxe objet de Smalltalk. Toute la syntaxe des opérations non orientées objet (y compris les variables primitives, le prétraitement, les expressions, les déclarations de fonction et les appels de fonction) est identique à celles du C, tandis que la syntaxe des fonctionnalités orientées objet est une implémentation de Smalltalk- messagerie de style.

Messages Modifier

En Objective-C, cela s'écrit comme suit :

Les deux styles de programmation ont leurs forces et leurs faiblesses. La programmation orientée objet dans le style Simula (C++) permet un héritage multiple et une exécution plus rapide en utilisant la liaison au moment de la compilation chaque fois que cela est possible, mais elle ne prend pas en charge la liaison dynamique par défaut. Cela force également toutes les méthodes à avoir une implémentation correspondante à moins qu'elles ne soient abstraites. La programmation de style Smalltalk telle qu'elle est utilisée dans Objective-C permet aux messages de ne pas être implémentés, la méthode étant résolue à son implémentation au moment de l'exécution. Par exemple, un message peut être envoyé à une collection d'objets, auxquels seuls certains seront censés répondre, sans craindre de produire des erreurs d'exécution. La transmission de messages ne nécessite pas non plus qu'un objet soit défini au moment de la compilation. Une implémentation est toujours requise pour que la méthode soit appelée dans l'objet dérivé. (Voir la section de saisie dynamique ci-dessous pour plus d'avantages de la liaison dynamique (tardive).)

Interfaces et implémentations Modifier

Objective-C exige que l'interface et l'implémentation d'une classe soient dans des blocs de code déclarés séparément. Par convention, les développeurs placent l'interface dans un fichier d'en-tête et l'implémentation dans un fichier de code. Les fichiers d'en-tête, normalement suffixés .h, sont similaires aux fichiers d'en-tête C tandis que les fichiers d'implémentation (méthode), normalement suffixés .m, peuvent être très similaires aux fichiers de code C.

Interface Modifier

Ceci est analogue aux déclarations de classe utilisées dans d'autres langages orientés objet, tels que C++ ou Python.

Une déclaration d'interface prend la forme :

Dans ce qui précède, les signes plus désignent des méthodes de classe, ou des méthodes qui peuvent être appelées sur la classe elle-même (pas sur une instance), et les signes moins désignent des méthodes d'instance, qui ne peuvent être appelées que sur une instance particulière de la classe. Les méthodes de classe n'ont pas non plus accès aux variables d'instance.

Le code ci-dessus est à peu près équivalent à l'interface C++ suivante :

Les arguments de méthode commencent par un nom étiquetant l'argument qui fait partie du nom de la méthode, suivi de deux-points suivi du type d'argument attendu entre parenthèses et du nom de l'argument. L'étiquette peut être omise.

Un dérivé de la définition de l'interface est le Catégorie, qui permet d'ajouter des méthodes aux classes existantes. [22]

Implémentation Modifier

L'interface ne déclare que l'interface de classe et non les méthodes elles-mêmes : le code réel est écrit dans le fichier d'implémentation. Les fichiers de mise en œuvre (méthode) ont normalement l'extension de fichier .m , qui signifiait à l'origine "messages". [23]

Les méthodes sont écrites à l'aide de leurs déclarations d'interface. Comparer Objective-C et C :

Cependant, les noms internes de la fonction sont rarement utilisés directement. Généralement, les messages sont convertis en appels de fonction définis dans la bibliothèque d'exécution Objective-C. On ne sait pas nécessairement au moment de la liaison quelle méthode sera appelée car la classe du récepteur (l'objet auquel le message est envoyé) n'a pas besoin d'être connue avant l'exécution.

Instanciation Modifier

Une fois qu'une classe Objective-C est écrite, elle peut être instanciée. Cela se fait en allouant d'abord une instance non initialisée de la classe (un objet), puis en l'initialisant. Un objet n'est pas entièrement fonctionnel tant que les deux étapes ne sont pas terminées. Ces étapes doivent être accomplies avec une seule ligne de code afin qu'il n'y ait jamais un objet alloué qui n'ait pas subi d'initialisation (et parce qu'il n'est pas judicieux de conserver le résultat intermédiaire puisque -init peut retourner un objet différent de celui sur lequel il est appelé ).

Instanciation avec l'initialiseur par défaut sans paramètre :

Instanciation avec un initialiseur personnalisé :

Dans le cas où aucune initialisation personnalisée n'est effectuée, la méthode "new" peut souvent être utilisée à la place des messages alloc-init :

De plus, certaines classes implémentent des initialiseurs de méthode de classe. Comme +new , ils combinent +alloc et -init , mais contrairement à +new , ils renvoient une instance autoreleased. Certains initialiseurs de méthodes de classe prennent des paramètres :

le allouer message alloue suffisamment de mémoire pour contenir toutes les variables d'instance d'un objet, définit toutes les variables d'instance sur des valeurs nulles et transforme la mémoire en une instance de la classe à aucun moment pendant l'initialisation, la mémoire n'est une instance de la superclasse.

le init message effectue la configuration de l'instance lors de sa création. le init méthode s'écrit souvent comme suit :

Dans l'exemple ci-dessus, notez le type de retour id. Ce type signifie "pointeur vers n'importe quel objet" en Objective-C (Voir la section Typage dynamique).

Le modèle d'initialisation est utilisé pour s'assurer que l'objet est correctement initialisé par sa superclasse avant que la méthode init n'effectue son initialisation. Il effectue les actions suivantes :

  1. self = [super init] Envoie à l'instance de la superclasse un init message et attribue le résultat à soi (pointeur sur l'objet courant).
  2. if (self) Vérifie si le pointeur d'objet renvoyé est valide avant d'effectuer toute initialisation.
  3. return self Renvoie la valeur de self à l'appelant.

Un pointeur d'objet non valide a la valeur néant Les instructions conditionnelles telles que "if" traitent nil comme un pointeur nul, donc le code d'initialisation ne sera pas exécuté si [super init] renvoie nil. S'il y a une erreur dans l'initialisation, la méthode init doit effectuer tout nettoyage nécessaire, y compris l'envoi d'un message "release" à self, et renvoyer néant pour indiquer que l'initialisation a échoué. Toute vérification de telles erreurs ne doit être effectuée qu'après avoir appelé l'initialisation de la superclasse pour s'assurer que la destruction de l'objet se fera correctement.

Si une classe a plus d'une méthode d'initialisation, une seule d'entre elles (l'"initialiseur désigné") doit suivre ce modèle, les autres devraient appeler l'initialiseur désigné au lieu de l'initialiseur de la superclasse.

Protocoles Modifier

Dans d'autres langages de programmation, ceux-ci sont appelés "interfaces".

Objective-C a été étendu à NeXT pour introduire le concept d'héritage multiple de spécification, mais pas d'implémentation, via l'introduction de protocoles. Il s'agit d'un modèle réalisable soit en tant que classe de base héritée multiple abstraite en C++, soit en tant qu'"interface" (comme en Java et C#). Objective-C utilise des protocoles ad hoc appelés protocoles informels et les protocoles appliqués par le compilateur appelés protocoles formels.

Un protocole informel est une liste de méthodes qu'une classe peut choisir d'implémenter. Il est précisé dans la documentation, puisqu'il n'est pas présent dans la langue. Les protocoles informels sont implémentés en tant que catégorie (voir ci-dessous) sur NSObject et incluent souvent des méthodes optionnelles, qui, si elles sont implémentées, peuvent changer le comportement d'une classe. Par exemple, une classe de champ de texte peut avoir un délégué qui implémente un protocole informel avec une méthode facultative pour effectuer la saisie semi-automatique du texte saisi par l'utilisateur. Le champ de texte découvre si le délégué implémente cette méthode (par réflexion) et, si c'est le cas, appelle la méthode du délégué pour prendre en charge la fonctionnalité de saisie semi-automatique.

Un protocole formel est similaire à une interface en Java, C# et Ada 2005. Il s'agit d'une liste de méthodes que n'importe quelle classe peut déclarer implémenter. Les versions d'Objective-C antérieures à 2.0 exigeaient qu'une classe implémente toutes les méthodes d'un protocole qu'elle se déclare comme adoptant le compilateur émettra une erreur si la classe n'implémente pas toutes les méthodes de ses protocoles déclarés. Objective-C 2.0 a ajouté la prise en charge du marquage facultatif de certaines méthodes dans un protocole, et le compilateur n'appliquera pas l'implémentation de méthodes facultatives.

Une classe doit être déclarée pour implémenter ce protocole pour être déclarée conforme. Ceci est détectable au moment de l'exécution. Les protocoles formels ne peuvent fournir aucune implémentation, ils assurent simplement aux appelants que les classes conformes au protocole fourniront des implémentations. Dans la bibliothèque NeXT/Apple, les protocoles sont fréquemment utilisés par le système d'objets distribués pour représenter les capacités d'un objet s'exécutant sur un système distant.

indique qu'il y a l'idée abstraite de verrouillage. En indiquant dans la définition de classe que le protocole est implémenté,

les instances de NSLock prétendent qu'elles fourniront une implémentation pour les deux méthodes d'instance.

Saisie dynamique Modifier

Objective-C, comme Smalltalk, peut utiliser le typage dynamique : un objet peut recevoir un message qui n'est pas spécifié dans son interface. Cela peut permettre une flexibilité accrue, car cela permet à un objet de « capturer » un message et d'envoyer le message à un autre objet qui peut répondre au message de manière appropriée, ou de même envoyer le message à un autre objet. Ce comportement est connu sous le nom transfert de message ou alors délégation (voir ci-dessous). Alternativement, un gestionnaire d'erreurs peut être utilisé au cas où le message ne peut pas être transféré. Si un objet ne transmet pas de message, n'y répond pas ou ne gère pas une erreur, le système génère une exception d'exécution. [24] Si des messages sont envoyés à néant (le pointeur d'objet nul), ils seront ignorés silencieusement ou lèveront une exception générique, selon les options du compilateur.

Des informations de typage statique peuvent également être facultativement ajoutées aux variables. Ces informations sont ensuite vérifiées au moment de la compilation. Dans les quatre instructions suivantes, des informations de type de plus en plus spécifiques sont fournies. Les instructions sont équivalentes au moment de l'exécution, mais les informations supplémentaires permettent au compilateur d'avertir le programmeur si l'argument passé ne correspond pas au type spécifié.

Dans la déclaration ci-dessus, foo peut être de n'importe quelle classe.

Dans la déclaration ci-dessus, foo peut être une instance de n'importe quelle classe conforme à la NSCopie protocole.

Dans la déclaration ci-dessus, foo doit être une instance de NSNumber classer.

Dans la déclaration ci-dessus, foo doit être une instance de NSNumber classe, et il doit être conforme à la NSCopie protocole.

Transfert Modifier

Objective-C permet l'envoi d'un message à un objet qui peut ne pas répondre. Plutôt que de répondre ou simplement de laisser tomber le message, un objet peut transmettre le message à un objet qui peut répondre. Le transfert peut être utilisé pour simplifier la mise en œuvre de certains modèles de conception, tels que le modèle observateur ou le modèle proxy.

Exemple Modifier

Voici un exemple de programme qui montre les bases du transfert.

Remarques Modifier

Lorsqu'il est compilé à l'aide de gcc, le compilateur indique :

Catégories Modifier

Lors de la conception d'Objective-C, l'une des principales préoccupations était la maintenabilité de grandes bases de code. L'expérience du monde de la programmation structurée avait montré que l'un des principaux moyens d'améliorer le code était de le décomposer en plus petits morceaux. Objective-C a emprunté et étendu le concept de catégories des implémentations Smalltalk pour vous aider dans ce processus. [25]

De plus, les méthodes d'une catégorie sont ajoutées à une classe au moment de l'exécution. Ainsi, les catégories permettent au programmeur d'ajouter des méthodes à une classe existante - une classe ouverte - sans avoir besoin de recompiler cette classe ou même d'avoir accès à son code source. Par exemple, si un système ne contient pas de correcteur orthographique dans son implémentation String, il peut être ajouté sans modifier le code source de String.

Les méthodes au sein des catégories deviennent indiscernables des méthodes d'une classe lorsque le programme est exécuté. Une catégorie a un accès complet à toutes les variables d'instance au sein de la classe, y compris les variables privées.

Si une catégorie déclare une méthode avec la même signature de méthode qu'une méthode existante dans une classe, la méthode de la catégorie est adoptée. Ainsi, les catégories peuvent non seulement ajouter des méthodes à une classe, mais aussi remplacer des méthodes existantes. Cette fonctionnalité peut être utilisée pour corriger des bogues dans d'autres classes en réécrivant leurs méthodes, ou pour provoquer un changement global du comportement d'une classe dans un programme. Si deux catégories ont des méthodes avec le même nom mais des signatures de méthode différentes, il n'est pas défini quelle méthode de catégorie est adoptée.

D'autres langues ont tenté d'ajouter cette fonctionnalité de diverses manières. TOM a poussé le système Objective-C un peu plus loin et a également permis l'ajout de variables. D'autres langages ont plutôt utilisé des solutions basées sur des prototypes, le plus notable étant Self.

Les langages C# et Visual Basic.NET implémentent des fonctionnalités superficiellement similaires sous la forme de méthodes d'extension, mais celles-ci n'ont pas accès aux variables privées de la classe. [26] Ruby et plusieurs autres langages de programmation dynamiques se réfèrent à la technique comme " patch de singe ".

Logtalk implémente un concept de catégories (en tant qu'entités de première classe) qui englobe la fonctionnalité des catégories Objective-C (les catégories Logtalk peuvent également être utilisées comme unités de composition à grain fin lors de la définition, par exemple, de nouvelles classes ou de prototypes en particulier, une catégorie Logtalk peut être virtuellement importés par un nombre quelconque de classes et de prototypes).

Exemple d'utilisation des catégories Modifier

Remarques Modifier

La compilation est effectuée, par exemple, par :

Posant Modifier

Objective-C permet à une classe de remplacer entièrement une autre classe dans un programme. La classe de remplacement est dite "se poser comme" la classe cible.

La pose de classe a été déclarée obsolète avec Mac OS X v10.5 et n'est pas disponible dans l'environnement d'exécution 64 bits. Des fonctionnalités similaires peuvent être obtenues en utilisant des méthodes qui sillonnent les catégories, qui échange l'implémentation d'une méthode avec une autre qui a la même signature.

Pour les versions prenant toujours en charge le posing, tous les messages envoyés à la classe cible sont plutôt reçus par la classe posing. Il existe plusieurs restrictions :

  • Une classe ne peut se poser que comme l'une de ses superclasses directes ou indirectes.
  • La classe posante ne doit pas définir de nouvelles variables d'instance absentes de la classe cible (bien qu'elle puisse définir ou remplacer des méthodes).
  • La classe cible peut n'avoir reçu aucun message avant la pose.

La pose, de la même manière que les catégories, permet une augmentation globale des classes existantes. La pose permet deux caractéristiques absentes des catégories :

  • Une classe posante peut appeler des méthodes surchargées via super, incorporant ainsi l'implémentation de la classe cible.
  • Une classe de pose peut remplacer les méthodes définies dans les catégories.

Cela intercepte chaque invocation de setMainMenu à NSApplication.

#import Modifier

Dans le langage C, la directive de pré-compilation #include provoque toujours l'insertion du contenu d'un fichier dans la source à ce stade. Objective-C a la directive #import, équivalente sauf que chaque fichier n'est inclus qu'une seule fois par unité de compilation, ce qui évite d'avoir à inclure des gardes.

Compilation Linux gcc Modifier

Les fonctionnalités d'Objective-C permettent souvent des solutions flexibles et souvent faciles aux problèmes de programmation.

  • La délégation de méthodes à d'autres objets et l'invocation à distance peuvent être facilement implémentées à l'aide de catégories et de transfert de messages. du pointeur isa permet aux classes de changer au moment de l'exécution. Généralement utilisé pour le débogage où les objets libérés sont transformés en objets zombies dont le seul but est de signaler une erreur lorsque quelqu'un les appelle. Swizzling a également été utilisé dans Enterprise Objects Framework pour créer des défauts de base de données. [citation requise] Swizzling est utilisé aujourd'hui par le framework Foundation d'Apple pour implémenter l'observation des valeurs-clés.

Objective-C++ Modifier

Objective-C++ est une variante de langage acceptée par le front-end de GNU Compiler Collection et Clang, qui peut compiler des fichiers source utilisant une combinaison de syntaxe C++ et Objective-C. Objective-C++ ajoute au C++ les extensions qu'Objective-C ajoute au C. Comme rien n'est fait pour unifier la sémantique derrière les différentes fonctionnalités du langage, certaines restrictions s'appliquent :

  • Une classe C++ ne peut pas dériver d'une classe Objective-C et vice versa.
  • Les espaces de noms C++ ne peuvent pas être déclarés dans une déclaration Objective-C.
  • Les déclarations Objective-C peuvent apparaître uniquement dans la portée globale, pas dans un espace de noms C++
  • Les classes Objective-C ne peuvent pas avoir de variables d'instance de classes C++ qui n'ont pas de constructeur par défaut ou qui ont une ou plusieurs méthodes virtuelles, [citation requise] mais les pointeurs vers des objets C++ peuvent être utilisés comme variables d'instance sans restriction (allouez-les avec new dans la méthode -init).
  • La sémantique C++ "par valeur" ne peut pas être appliquée aux objets Objective-C, qui ne sont accessibles que par des pointeurs.
  • Une déclaration Objective-C ne peut pas être dans une déclaration de modèle C++ et vice versa. Cependant, les types Objective-C (par exemple, Classname * ) peuvent être utilisés comme paramètres de modèle C++.
  • La gestion des exceptions Objective-C et C++ est distincte, les gestionnaires de chacun ne peuvent pas gérer les exceptions de l'autre type. Par conséquent, les destructeurs d'objets ne sont pas exécutés. Ceci est atténué dans les récents runtimes "Objective-C 2.0" car les exceptions Objective-C sont soit complètement remplacées par des exceptions C++ (exécution Apple), soit partiellement lorsque la bibliothèque Objective-C++ est liée (GNUstep libobjc2). [27]
  • Les blocs Objective-C et les lambdas C++11 sont des entités distinctes. Cependant, un bloc est généré de manière transparente sur macOS lors du passage d'un lambda où un bloc est attendu. [28]

Objective-C 2.0 Modifier

Lors de la conférence mondiale des développeurs de 2006, Apple a annoncé la sortie de "Objective-C 2.0", une révision du langage Objective-C pour inclure "le ramasse-miettes moderne, les améliorations de la syntaxe, [29] les améliorations des performances d'exécution, [30] et 64- peu d'appui". Mac OS X v10.5, sorti en octobre 2007, incluait un compilateur Objective-C 2.0. GCC 4.6 prend en charge de nombreuses nouvelles fonctionnalités Objective-C, telles que les propriétés déclarées et synthétisées, la syntaxe à points, l'énumération rapide, les méthodes de protocole facultatives, les attributs de méthode/protocole/classe, les extensions de classe et une nouvelle API d'exécution GNU Objective-C. [31]

Le nom Objective-C 2.0 représente une rupture dans le système de versionnage du langage, car la dernière version Objective-C pour NeXT était "objc4". [32] Ce nom de projet a été conservé dans la dernière version du code source d'exécution Objective-C hérité de Mac OS X Leopard (10.5). [33]

Collecte des ordures Modifier

Objective-C 2.0 fournissait un ramasse-miettes générationnel et conservateur en option.Lorsqu'il est exécuté en mode rétrocompatible, le runtime a transformé les opérations de comptage de références telles que "retain" et "release" en no-ops. Tous les objets étaient soumis au garbage collection lorsque le garbage collection était activé. Les pointeurs C réguliers pourraient être qualifiés de "__strong" pour également déclencher les interceptions sous-jacentes du compilateur de la barrière d'écriture et ainsi participer au ramasse-miettes. [34] Un sous-système faible de mise à zéro a également été fourni de telle sorte que les pointeurs marqués comme "__weak" soient mis à zéro lorsque l'objet (ou plus simplement, la mémoire GC) est collecté. Le ramasse-miettes n'existe pas sur l'implémentation iOS d'Objective-C 2.0. [35] La récupération de place dans Objective-C s'exécute sur un thread d'arrière-plan de faible priorité et peut s'arrêter sur les événements utilisateur, avec l'intention de garder l'expérience utilisateur réactive. [36]

La collecte des ordures a été dépréciée dans Mac OS X v10.8 en faveur du comptage automatique de références (ARC). [37] Objective-C sur iOS 7 fonctionnant sur ARM64 utilise 19 bits sur un mot de 64 bits pour stocker le nombre de références, sous forme de pointeurs étiquetés. [38] [39]

Propriétés Modifier

Objective-C 2.0 introduit une nouvelle syntaxe pour déclarer les variables d'instance en tant que propriétés, avec des attributs facultatifs pour configurer la génération des méthodes d'accès. Les propriétés sont, dans un sens, des variables d'instance publiques, c'est-à-dire que déclarer une variable d'instance en tant que propriété fournit aux classes externes un accès (éventuellement limité, par exemple en lecture seule) à cette propriété. Une propriété peut être déclarée en "lecture seule" et peut être dotée d'une sémantique de stockage telle que assign , copy ou keep . Par défaut, les propriétés sont considérées comme atomiques , ce qui entraîne un verrou empêchant plusieurs threads d'y accéder en même temps. Une propriété peut être déclarée comme nonatomic , ce qui supprime ce verrou.

Les propriétés sont implémentées via le mot-clé @synthesize, qui génère des méthodes getter (et setter, sinon en lecture seule) en fonction de la déclaration de propriété. Alternativement, les méthodes getter et setter doivent être implémentées explicitement, ou le mot clé @dynamic peut être utilisé pour indiquer que les méthodes d'accès seront fournies par d'autres moyens. Lors de la compilation à l'aide de clang 3.1 ou supérieur, toutes les propriétés qui ne sont pas explicitement déclarées avec @dynamic , marquées en lecture seule ou qui ont un getter et un setter complets implémentés par l'utilisateur seront automatiquement implicitement @synthesize 'd.

Les propriétés sont accessibles à l'aide de la syntaxe de transmission de message traditionnelle, de la notation par points ou, dans le codage clé-valeur, par nom via les méthodes "valueForKey:"/"setValue:forKey:".

Afin d'utiliser la notation par points pour invoquer des accesseurs de propriété dans une méthode d'instance, le mot-clé "self" doit être utilisé :

Les propriétés d'une classe ou d'un protocole peuvent être introspectées dynamiquement.

Variables d'instance non fragiles Modifier

Objective-C 2.0 fournit des variables d'instance non fragiles lorsqu'elles sont prises en charge par l'environnement d'exécution (c'est-à-dire lors de la création de code pour macOS 64 bits et tous les iOS). Sous l'environnement d'exécution moderne, une couche supplémentaire d'indirection est ajoutée à l'accès aux variables d'instance, permettant à l'éditeur de liens dynamique d'ajuster la disposition de l'instance au moment de l'exécution. Cette fonctionnalité permet deux améliorations importantes du code Objective-C :

  • Il élimine le problème d'interface binaire fragile. Les superclasses peuvent changer de taille sans affecter la compatibilité binaire.
  • Il permet aux variables d'instance qui fournissent le support des propriétés d'être synthétisées au moment de l'exécution sans qu'elles soient déclarées dans l'interface de la classe.

Énumération rapide Modifier

Au lieu d'utiliser un objet ou des indices NSEnumerator pour parcourir une collection, Objective-C 2.0 offre la syntaxe d'énumération rapide. Dans Objective-C 2.0, les boucles suivantes sont fonctionnellement équivalentes, mais ont des caractéristiques de performances différentes.

L'énumération rapide génère un code plus efficace que l'énumération standard car les appels de méthode pour énumérer sur des objets sont remplacés par une arithmétique de pointeur utilisant le protocole NSFastEnumeration. [40]

Extensions de classe Modifier

Une extension de classe a la même syntaxe qu'une déclaration de catégorie sans nom de catégorie, et les méthodes et propriétés qui y sont déclarées sont ajoutées directement à la classe principale. Il est principalement utilisé comme alternative à une catégorie pour ajouter des méthodes à une classe sans les publier dans les en-têtes publics, avec l'avantage que pour les extensions de classe, le compilateur vérifie que toutes les méthodes déclarées en privé sont réellement implémentées. [41]

Implications pour le développement du cacao Modifier

Toutes les applications Objective-C développées pour macOS qui utilisent les améliorations ci-dessus pour Objective-C 2.0 sont incompatibles avec tous les systèmes d'exploitation antérieurs à 10.5 (Leopard). Étant donné que l'énumération rapide ne génère pas exactement les mêmes binaires que l'énumération standard, son utilisation entraînera le blocage d'une application sur Mac OS X version 10.4 ou antérieure.

Blocs Modifier

Blocks est une extension non standard pour Objective-C (et C et C++) qui utilise une syntaxe spéciale pour créer des fermetures. Les blocs ne sont pris en charge que dans Mac OS X 10.6 "Snow Leopard" ou version ultérieure, iOS 4 ou version ultérieure, et GNUstep avec libobjc2 1.7 et compilation avec clang 3.1 ou version ultérieure. [42]

Objective-C moderne Modifier

Apple a ajouté des fonctionnalités supplémentaires à Objective 2.0 au fil du temps. Les ajouts ne s'appliquent qu'au "compilateur Apple LLVM", c'est-à-dire à l'interface clang du langage. De manière confuse, la gestion des versions utilisée par Apple diffère de celle du LLVM en amont, référez-vous aux versions Xcode § Toolchain pour une traduction vers les numéros de version LLVM open source. [43]

Comptage de référence automatique Modifier

Le comptage automatique de références (ARC) est une fonctionnalité au moment de la compilation qui élimine le besoin pour les programmeurs de gérer manuellement les décomptes de retenue à l'aide de retenue et de libération . [44] Contrairement au ramasse-miettes, qui se produit au moment de l'exécution, ARC élimine la surcharge d'un processus distinct gérant les comptes de rétention. ARC et la gestion manuelle de la mémoire ne s'excluent pas mutuellement. Les programmeurs peuvent continuer à utiliser du code non ARC dans les projets compatibles ARC en désactivant ARC pour les fichiers de code individuels. Xcode peut également tenter de mettre à niveau automatiquement un projet vers ARC.

ARC a été introduit dans LLVM 3.0. Cela se traduit par Xcode 4.2 (2011) ou le compilateur Apple LLVM 3.0. [45]

Littéraux Modifier

Les environnements d'exécution NeXT et Apple Obj-C ont longtemps inclus un moyen abrégé de créer de nouvelles chaînes, en utilisant la syntaxe littérale @"a new string" , ou en passant aux constantes CoreFoundation kCFBooleanTrue et kCFBooleanFalse pour NSNumber avec des valeurs booléennes. L'utilisation de ce format évite au programmeur d'avoir à utiliser la méthode initWithString plus longue ou des méthodes similaires lors de certaines opérations.

Lorsque vous utilisez le compilateur Apple LLVM 4.0 (Xcode 4.4) ou une version ultérieure, des tableaux, des dictionnaires et des nombres (classes NSArray, NSDictionary, NSNumber) peuvent également être créés à l'aide de la syntaxe littérale au lieu de méthodes. [46] (Le compilateur Apple LLVM 4.0 se traduit par LLVM open source et Clang 3.1.) [47]

Cependant, à la différence des littéraux de chaîne, qui se compilent en constantes dans l'exécutable, ces littéraux se compilent en code équivalent aux appels de méthode ci-dessus. En particulier, dans le cadre de la gestion manuelle de la mémoire comptée par référence, ces objets sont libérés automatiquement, ce qui nécessite des précautions supplémentaires lorsqu'ils sont, par exemple, utilisés avec des variables statiques de fonction ou d'autres types de globales.

Abonnement Modifier

Lors de l'utilisation du compilateur Apple LLVM 4.0 ou version ultérieure, les tableaux et les dictionnaires (classes NSArray et NSDictionary) peuvent être manipulés à l'aide d'un indice. [46] L'indice peut être utilisé pour récupérer des valeurs à partir d'index (tableau) ou de clés (dictionnaire), et avec des objets mutables, peut également être utilisé pour définir des objets sur des index ou des clés. Dans le code, l'indice est représenté par des crochets [ ] . [48]

Exemple sans abonnement :

Exemple avec abonnement :

Syntaxe Objective-C "moderne" (1997) Modifier

Après l'achat de NeXT par Apple, des tentatives ont été faites pour rendre le langage plus acceptable pour les programmeurs plus familiers avec Java que Smalltalk. L'une de ces tentatives a été d'introduire ce qui était surnommé la « syntaxe moderne » pour Objective-C à l'époque [49] (par opposition à la syntaxe « classique » actuelle). Il n'y a eu aucun changement de comportement, il s'agissait simplement d'une syntaxe alternative. Au lieu d'écrire une invocation de méthode comme

Il était plutôt écrit comme

De même, les déclarations sont passées du formulaire

Cette syntaxe "moderne" n'est plus supportée dans les dialectes actuels du langage Objective-C.

Mulle-objc Modifier

Le projet mulle-objc est une autre ré-implémentation d'Objective-C. Il prend en charge les compilateurs GCC ou Clang/LLVM en tant que backends. Il diffère des autres environnements d'exécution en termes de syntaxe, de sémantique et de compatibilité ABI. Il prend en charge Linux, FreeBSD et Windows.

Compilateur d'objets portables Modifier

Outre l'implémentation GCC/NeXT/Apple, qui a ajouté plusieurs extensions à l'implémentation originale de Stepstone, une autre implémentation Objective-C gratuite et open source appelée Portable Object Compiler existe également. [50] L'ensemble des extensions implémentées par le Portable Object Compiler diffère de l'implémentation GCC/NeXT/Apple en particulier, il inclut des blocs de type Smalltalk pour Objective-C, alors qu'il manque de protocoles et de catégories, deux fonctionnalités largement utilisées dans OpenStep et ses dérivés et apparentés. Dans l'ensemble, POC représente une étape plus ancienne, pré-NeXT dans l'évolution de la langue, à peu près conforme au livre de 1991 de Brad Cox.

Il comprend également une bibliothèque d'exécution appelée ObjectPak, qui est basée sur la bibliothèque ICPak101 originale de Cox (qui à son tour dérive de la bibliothèque de classes Smalltalk-80), et est assez radicalement différente de l'OpenStep FoundationKit.

GEOS Objective-C Modifier

Le système PC GEOS utilisait un langage de programmation appelé Objectif GEOS-C ou alors goc [51] malgré la similitude de nom, les deux langues ne sont similaires que dans le concept global et l'utilisation de mots-clés préfixés par un signe @.

Clang Modifier

La suite de compilateurs Clang, qui fait partie du projet LLVM, implémente Objective-C et d'autres langages. Après le passage de GCC 4.3 (2008) à la GPLv3, Apple l'a abandonné au profit de clang, un compilateur qu'il a plus de pouvoir légal de modifier. Par conséquent, de nombreuses fonctionnalités du langage Objective-C moderne ne sont prises en charge que par Clang.

Le schéma de version d'Apple pour son "compilateur LLVM" basé sur Clang diffère de la gestion de version open source de LLVM. Voir les versions Xcode § Toolchain pour une traduction [43]

GNU, GNUstep et WinObjC Modifier

Le code source frontal de NeXT a été publié car il a été créé dans le cadre de GCC, la licence publique GNU publiée qui oblige ceux qui créent des travaux dérivés à le faire. [ lorsque? ] Apple a poursuivi cette tradition en publiant son fork de GCC jusqu'à 4.2.1, après quoi ils ont abandonné le compilateur. Les responsables de GCC ont intégré les changements, mais n'ont pas beaucoup investi dans la prise en charge de nouvelles fonctionnalités telles que le langage Objective-C 2.0. [32] ( Quel compilateur )

Sous Windows, des outils de développement Objective-C sont fournis en téléchargement sur le site Web de GNUStep. Le système de développement GNUStep se compose des packages suivants : GNUstep MSYS System, GNUstep Core, GNUstep Devel, GNUstep Cairo, ProjectCenter IDE (comme Xcode, mais pas aussi complexe), Gorm (Interface Builder Like Xcode NIB builder). Ces programmes d'installation binaires n'ont pas été mis à jour depuis 2016, [55], il pourrait donc être préférable de simplement installer en construisant sous Cygwin ou MSYS2.

Objective-C est aujourd'hui souvent utilisé en tandem avec une bibliothèque fixe d'objets standard (souvent appelés "kit" ou "framework"), tels que Cocoa, GNUstep ou ObjFW. Ces bibliothèques sont souvent livrées avec le système d'exploitation : les bibliothèques GNUstep sont souvent livrées avec des distributions basées sur Linux et Cocoa est livrée avec macOS. Le programmeur n'est pas obligé d'hériter des fonctionnalités de la classe de base existante (NSObject / OFObject). Objective-C permet la déclaration de nouvelles classes racines qui n'héritent d'aucune fonctionnalité existante. À l'origine, les environnements de programmation basés sur Objective-C offraient généralement une classe Object comme classe de base dont presque toutes les autres classes héritaient. Avec l'introduction d'OpenStep, NeXT a créé une nouvelle classe de base nommée NSObject, qui offrait des fonctionnalités supplémentaires par rapport à Object (un accent sur l'utilisation de références d'objets et le comptage de références au lieu de pointeurs bruts, par exemple). Presque toutes les classes de Cocoa héritent de NSObject.

Non seulement le changement de nom a servi à différencier le nouveau comportement par défaut des classes au sein de l'API OpenStep, mais il a permis au code qui utilisait Object - la classe de base d'origine utilisée sur NeXTSTEP (et, plus ou moins, d'autres bibliothèques de classes Objective-C) - de coexister dans le même runtime avec du code qui utilisait NSObject (avec quelques limitations). L'introduction du préfixe à deux lettres est également devenue une forme simpliste d'espaces de noms, ce qui manque à Objective-C. L'utilisation d'un préfixe pour créer un identifiant d'emballage informel est devenue une norme de codage informelle dans la communauté Objective-C, et continue à ce jour.

Plus récemment, des gestionnaires de packages ont fait leur apparition, comme CocoaPods, qui se veut à la fois gestionnaire de packages et référentiel de packages. Une grande partie du code Objective-C open source qui a été écrit au cours des dernières années peut désormais être installé à l'aide de CocoaPods.

Les implémentations Objective-C utilisent un système d'exécution léger écrit en C [ citation requise ] , ce qui ajoute peu à la taille de l'application. En revanche, la plupart des systèmes orientés objet au moment de leur création utilisaient de grands runtimes de machines virtuelles. Les programmes écrits en Objective-C ont tendance à ne pas être beaucoup plus grands que la taille de leur code et celle des bibliothèques (qui n'ont généralement pas besoin d'être incluses dans la distribution du logiciel), contrairement aux systèmes Smalltalk où une grande quantité de mémoire était utilisé juste pour ouvrir une fenêtre. Les applications Objective-C ont tendance à être plus volumineuses que les applications C ou C++ similaires, car le typage dynamique Objective-C ne permet pas de supprimer ou d'intégrer les méthodes. Étant donné que le programmeur a une telle liberté de déléguer, de transférer des appels, de construire des sélecteurs à la volée et de les transmettre au système d'exécution, le compilateur Objective-C ne peut pas supposer qu'il est sûr de supprimer les méthodes inutilisées ou d'effectuer des appels en ligne.

De même, le langage peut être implémenté sur des compilateurs C existants (dans GCC, d'abord en tant que préprocesseur, puis en tant que module) plutôt que comme un nouveau compilateur. Cela permet à Objective-C de tirer parti de l'énorme collection existante de code C, de bibliothèques, d'outils, etc. Les bibliothèques C existantes peuvent être encapsulées dans des wrappers Objective-C pour fournir une interface de style OO. Sous cet aspect, il est similaire à la bibliothèque GObject et au langage Vala, qui sont largement utilisés dans le développement d'applications GTK.

Tous ces changements pratiques ont abaissé la barrière à l'entrée, probablement le plus gros problème pour l'acceptation généralisée de Smalltalk dans les années 1980.

Une critique courante est qu'Objective-C ne prend pas en charge le langage pour les espaces de noms. Au lieu de cela, les programmeurs sont obligés d'ajouter des préfixes à leurs noms de classe, qui sont traditionnellement plus courts que les noms d'espace de noms et donc plus sujets aux collisions. Depuis 2007, toutes les classes et fonctions macOS dans l'environnement de programmation Cocoa sont préfixées par "NS" (par exemple NSObject, NSButton) pour les identifier comme appartenant au noyau macOS ou iOS, le "NS" dérive des noms des classes tels que définis pendant le développement de NeXTSTEP.

Puisque Objective-C est un sur-ensemble strict de C, il ne traite pas les types primitifs C comme des objets de première classe.

Contrairement au C++, Objective-C ne prend pas en charge la surcharge d'opérateurs. Contrairement au C++, Objective-C permet à un objet d'hériter directement d'une seule classe (interdisant l'héritage multiple). Cependant, dans la plupart des cas, les catégories et les protocoles peuvent être utilisés comme moyens alternatifs pour obtenir les mêmes résultats.

Étant donné qu'Objective-C utilise un typage d'exécution dynamique et que tous les appels de méthode sont des appels de fonction (ou, dans certains cas, des appels système), de nombreuses optimisations de performances courantes ne peuvent pas être appliquées aux méthodes Objective-C (par exemple : inlining, propagation constante, optimisations interprocédurales, et remplacement scalaire des agrégats). Cela limite les performances des abstractions Objective-C par rapport aux abstractions similaires dans des langages tels que C++ où de telles optimisations sont possibles.

Gestion de la mémoire Modifier

Les premières versions d'Objective-C ne prenaient pas en charge le ramasse-miettes. À l'époque, cette décision faisait l'objet d'un débat, et de nombreuses personnes considéraient de longs "temps morts" (lorsque Smalltalk effectuait la collecte) pour rendre l'ensemble du système inutilisable. Certaines implémentations tierces ont ajouté cette fonctionnalité (notamment GNUstep utilisant Boehm), et Apple l'a implémentée à partir de Mac OS X v10.5. [56] Cependant, dans les versions plus récentes de macOS et iOS, le ramasse-miettes a été déprécié au profit du comptage automatique de références (ARC), introduit en 2011.

Avec ARC, le compilateur insère automatiquement les appels de rétention et de libération dans le code Objective-C sur la base d'une analyse de code statique. L'automatisation évite au programmeur d'avoir à écrire du code de gestion mémoire. ARC ajoute également des références faibles au langage Objective-C. [57]

Différences philosophiques entre Objective-C et C++ Modifier

La conception et l'implémentation de C++ et Objective-C représentent des approches fondamentalement différentes pour étendre le C.

En plus du style de programmation procédurale de C, C++ prend directement en charge certaines formes de programmation orientée objet, de programmation générique et de métaprogrammation. C++ est également livré avec une grande bibliothèque standard qui comprend plusieurs classes de conteneurs. De même, Objective-C ajoute la programmation orientée objet, le typage dynamique et la réflexion à C. Objective-C ne fournit pas de bibliothèque standard en soi, mais dans la plupart des endroits où Objective-C est utilisé, il est utilisé avec une bibliothèque de type OpenStep telle que OPENSTEP, Cocoa ou GNUstep, qui fournit des fonctionnalités similaires à la bibliothèque standard de C++.

Une différence notable est qu'Objective-C fournit un support d'exécution pour les fonctionnalités réfléchissantes, alors que C++ n'ajoute qu'une petite quantité de support d'exécution à C. En Objective-C, un objet peut être interrogé sur ses propres propriétés, par exemple, s'il répondra à un certain message. En C++, cela n'est pas possible sans l'utilisation de bibliothèques externes.

L'utilisation de la réflexion fait partie de la distinction plus large entre les fonctionnalités dynamiques (au moment de l'exécution) et les fonctionnalités statiques (au moment de la compilation) d'un langage. Bien que Objective-C et C++ utilisent chacun un mélange des deux fonctionnalités, Objective-C est résolument orienté vers les décisions d'exécution tandis que C++ est orienté vers les décisions de compilation. La tension entre la programmation dynamique et statique implique de nombreux compromis classiques dans la programmation : les fonctionnalités dynamiques ajoutent de la flexibilité, les fonctionnalités statiques ajoutent de la vitesse et la vérification de type.

La programmation générique et la métaprogrammation peuvent être implémentées dans les deux langages en utilisant le polymorphisme d'exécution. En C++, cela prend la forme de fonctions virtuelles et d'une identification de type à l'exécution, tandis qu'Objective-C offre un typage et une réflexion dynamiques. Objective-C et C++ prennent tous deux en charge le polymorphisme à la compilation (fonctions génériques), Objective-C n'ajoutant cette fonctionnalité qu'en 2015.


Comment créer une nouvelle classe d'entités à partir d'un FC existant et d'une clause WHERE ? - Systèmes d'information géographique

WFM et/ou TAM de Esri
HTML5 de Écervelé ou alors Adobe

Maintenez une approche cohérente et faites évoluer votre personnel avec un environnement de formation structuré.

Dotez votre personnel – avec nos flux de travail gérés et nos assistants de tâches – personnalisés selon vos besoins commerciaux spécifiques avec la plus grande efficacité.

Tenez la documentation à jour grâce à nos services d'assistance technique en utilisant les méthodes de gestion des flux de travail Esri augmentées par notre capacité de création Web/print à source unique.

Logiciel en tant que service (SaaS)

Coordonnées Z — fournissez-nous vos relevés GPS et nous pouvons installer les coordonnées Z sur votre ligne médiane et/ou vos itinéraires.

Courbe & amp Grade — envoyez-nous vos meilleures lignes médianes et nous développerons la soumission des courbes HPMS. Nous ferons également les cotes si les élévations sont disponibles.

LRS avancé — envoyez-nous vos meilleures lignes médianes E-911 et nous les passerons à travers LRS Data Reviewer et construirons vos itinéraires LRS pour vous à un rythme record pour une efficacité maximale. Envoyez les résultats à Esri Roads and Highways ou utilisez LRS Lite pour créer des événements/fonctionnalités à l'aide de l'efficacité d'ArcGIS Desktop .


Maintenance des fonctionnalités accessibles

Les éléments accessibles de la piscine doivent être maintenus en état de fonctionnement et de fonctionnement afin que les personnes handicapées aient accès à la piscine chaque fois que la piscine est ouverte à d'autres. Par exemple, un élévateur de piscine portable peut être stocké lorsque la piscine est fermée, mais il doit être au bord de la piscine et pleinement opérationnel pendant toutes les heures d'ouverture de la piscine.

Une entité doit reconnaître que certains types d'équipements peuvent nécessiter plus de personnel et d'entretien que d'autres (par exemple, s'assurer qu'il y a suffisamment de batteries pour qu'un élévateur de piscine maintienne une charge continue pendant les heures d'ouverture de la piscine). Les entités doivent planifier ces problèmes et modifier les politiques opérationnelles au besoin pour fournir des moyens d'entrée accessibles pendant que le pool est ouvert.


Découvrez comment nous assurons la sécurité, la confidentialité des données et la conformité, et découvrez nos conditions d'utilisation.

Confidentialité des données

New Relic prend la confidentialité de vos données au sérieux. Notre approche fondée sur des principes vise à aller au-delà des exigences légales en matière de consentement.

Conformité à la sécurité

Que vos données soient en transit vers New Relic ou au repos dans notre stockage, des mesures de cryptage solides peuvent aider à protéger contre les accès non autorisés ou le vol de données précieuses.

Bulletin de sécurité

Les bulletins de sécurité sont un moyen pour nous de vous informer des vulnérabilités de sécurité, des stratégies de correction et des mises à jour applicables.

Licences

Tout sur les licences, le plan d'utilisation et les politiques de New Relic. Découvrez les logiciels open source que nous utilisons dans nos produits.


Contenu

Le Royaume-Uni n'a jamais connu la dépossession soudaine des domaines de la noblesse, qui s'est produite dans une grande partie de l'Europe après la Révolution française ou au début du 20e siècle, et la noblesse britannique, dans la mesure où elle existait en tant que classe sociale distincte, intégrée avec ceux qui ont de nouvelles richesses provenant de sources commerciales et industrielles plus confortablement que dans la plupart des pays d'Europe. Les opportunités résultant d'une croissance économique constante et de l'expansion de l'Empire britannique ont également permis à certains issus de milieux beaucoup plus pauvres (généralement des hommes qui avaient réussi à acquérir une certaine éducation) de gravir les échelons du système de classe.

L'historien David Cannadine voit la période autour de 1880 comme un pic après lequel la position des vieilles familles puissantes a décliné rapidement, pour un certain nombre de causes, atteignant un creux dans les années qui ont suivi la Seconde Guerre mondiale, symbolisé par la destruction généralisée des maisons de campagne. Cependant, leur richesse, sinon leur pouvoir politique, a fortement rebondi depuis les années 1980, bénéficiant de la valeur fortement accrue de la terre et des beaux-arts que beaucoup possédaient en quantité.

Pendant ce temps, les classes moyennes britanniques complexes avaient également connu une longue période de croissance et de prospérité croissante, et avaient acquis un pouvoir politique au niveau national à un degré inhabituel en Europe. Ils évitaient la stratification stricte de nombreuses classes moyennes continentales et formaient un groupe important et amorphe étroitement lié à leurs bords à la fois à la petite noblesse et à l'aristocratie et aux classes laborieuses. En particulier, le grand centre financier de la City de Londres était ouvert aux étrangers à un degré inhabituel, et ne cessait de s'étendre et de créer de nouveaux emplois.

La classe ouvrière britannique, d'autre part, n'était pas remarquable en Europe pour la prospérité, [14] et les premiers voyageurs britanniques modernes ont souvent remarqué le niveau de vie élevé des ouvriers agricoles et des artisans des Pays-Bas, bien que la paysannerie dans d'autres pays tels que car la France a été remarquée comme plus pauvre que leurs équivalents anglais. Le niveau de vie s'est certes beaucoup amélioré au cours de la période, plus encore en Angleterre que dans d'autres parties du Royaume-Uni, mais la révolution industrielle a été marquée par des conditions de travail extrêmement dures et des logements insalubres jusqu'au milieu du XIXe siècle environ.

Début de la modernité Modifier

Au moment de la formation de la Grande-Bretagne en 1707, l'Angleterre et l'Écosse avaient des structures sociales de classe similaires. Certaines catégories de base couvrant la majeure partie de la population britannique entre 1500 et 1700 sont les suivantes. [15] [16]

Classer Caractéristiques
Agriculteur ou domestique ouvrier Les paysans étaient un échelon en dessous des agriculteurs, en ce sens qu'ils devaient travailler pour d'autres pour un salaire. L'ordre le plus bas des castes ouvrières, peut-être des vagabonds, des vagabonds, des criminels ou d'autres parias, serait inférieur. L'esclavage en Angleterre s'est éteint vers 1200 après JC. La plupart des jeunes femmes des rangs moyens et inférieurs sont devenues les servantes des familles voisines pendant quelques années avant le mariage. Les domestiques dans l'élevage étaient des hommes célibataires embauchés sous contrat annuel comme ouvriers agricoles. [17]
Homme de ménage (ou autres commerçants) Un commerçant ou un agriculteur qui louait une maison ou possédait très peu de terre était un agriculteur. À l'époque féodale, cette personne aurait probablement été un serf et aurait payé une grande partie de son travail ou de ses produits au seigneur terrien.
Yeoman La classe yeoman comprenait généralement de petits agriculteurs qui possédaient une quantité raisonnable de terres et étaient capables de se protéger des seigneurs voisins et cetera. Ils ont joué un rôle militaire en tant qu'archers avant 1500. Le commerçant du village était placé entre yeoman et gentry dans la hiérarchie sociale moderne. [18]
Le clergé Le clergé était principalement situé dans les zones rurales, où il était sous la direction de la gentry. [19] Un évêque avait le statut de noblesse et siégeait à la Chambre des Lords, mais son fils n'héritait pas du titre. [20]
Gentilhomme/gentilhomme La noblesse, par définition, détenait suffisamment d'actifs pour vivre de la rente foncière sans travailler, et pouvait donc être bien éduquée. S'ils travaillaient, c'était en droit, en tant que prêtres, en politique ou dans d'autres activités instruites sans travail manuel. Le terme Esquire était utilisé pour les propriétaires fonciers qui n'étaient pas anoblis, un terme qui devint plus tard Squire et appelé Squirarchy. Ils possédaient généralement des domaines exploités par des locataires et des ouvriers. Il était prestigieux d'acheter une commission militaire ou navale pour un fils probable. [21]
Professionnel et homme d'affaires Les professionnels urbains comprenaient des avocats, le statut le plus élevé allant aux avocats de Londres et aux Inns of Court. Les médecins devenaient de plus en plus nombreux à se professionnaliser et à se former sur des bases de connaissances en croissance rapide. Les marchands et les hommes d'affaires pouvaient avoir un statut allant de moyen à élevé, en fonction de leur richesse et de leur importance. Pour un plus grand prestige social, ils achèteraient un domaine foncier ou négocieraient un titre de chevalier ou de baronnet. [22] [23] [24]
chevalier Le rôle de la chevalerie était très important à l'époque médiévale, avec le rôle d'organiser les forces militaires locales au nom d'un noble supérieur. Cependant, en 1600, le titre était honorifique, souvent accordé aux soldats de combat exceptionnels de l'armée du roi. [25]
Baronnet (héréditaire, non pair) Un baronnet détenait un style héréditaire de chevalerie, donnant le rang le plus élevé en dessous d'une pairie.
Aristocratie : Pair (Noble) Les rangs allaient de baron à duc. Les règles de succession étaient généralement élaborées, cependant, le fils aîné héritait du titre et de la richesse. Lorsque la lignée masculine a expiré, le titre a également expiré (mais la famille a conservé la terre). Les pairs étaient généralement de grands propriétaires terriens, souvent également propriétaires d'une maison à Londres. Ils siégeaient à la Chambre des Lords et jouaient souvent un rôle devant les tribunaux. [26] L'Irlande et l'Écosse avaient des aristocraties entièrement séparées, leurs nobles siégeaient dans leurs propres parlements mais pas dans la Chambre des Lords anglaise. [27] [28]
Royal Un membre de la famille royale, un prince ou un proche parent de la reine ou du roi.

20e siècle Modifier

La classification sociale créée par l'Enquête nationale sur le lectorat il y a plus de 50 ans a été largement utilisée au cours du 20e siècle dans les rapports et statistiques marketing et gouvernementaux.

Noter Occupation
UNE Supérieur managérial, administratif ou professionnel
B Cadre intermédiaire, administratif ou professionnel
C1 Superviseur ou employé de bureau et cadre junior, administratif ou professionnel
C2 Ouvriers qualifiés
Ouvriers semi et non qualifiés
E Travailleurs occasionnels ou de grade inférieur, retraités et autres personnes qui dépendent de l'État pour leurs revenus

21e siècle Modifier

L'Office for National Statistics (ONS) du Royaume-Uni a produit une nouvelle classification socio-économique en 2001. [29] La raison en était de fournir une classification plus complète et détaillée pour prendre en compte les nouveaux modèles d'emploi.

Grouper La description Équivalent NRS
1 Professions supérieures professionnelles et de gestion UNE
2 Professions de direction et professions libérales inférieures B
3 Professions intermédiaires C1 et C2
4 Petits employeurs et travailleurs à leur propre compte C1 et C2
5 Postes de supervision et de techniciens inférieurs C1 et C2
6 Occupations semi-routinières
7 Occupations courantes
8 Jamais travaillé et chômeur de longue durée E

Grande enquête de classe britannique Modifier

Le 2 avril 2013, l'analyse des résultats d'une enquête [30] menée par la BBC en 2011 et développée en collaboration avec des experts universitaires, a été publiée en ligne dans la revue Sociologie. [31] [32] [33] [34] [35] Les résultats publiés étaient basés sur une enquête de 160 000 résidents du Royaume-Uni dont la plupart vivaient en Angleterre et se sont décrits comme "blancs". La classe a été définie et mesurée en fonction de la quantité et du type de ressources économiques, culturelles et sociales, les « capitales » déclarées. Le capital économique était défini comme le revenu et les actifs, le capital culturel comme le montant et le type d'intérêts et d'activités culturels, et le capital social comme la quantité et le statut social de leurs amis, de leur famille et de leurs contacts personnels et professionnels. [34] Ce cadre théorique s'inspire de celui de Pierre Bourdieu, qui a publié sa théorie de la distinction sociale en 1979.

Résultats Modifier

L'analyse de l'enquête a révélé sept classes : une « élite » aisée une « classe moyenne » salariée prospère composée de professionnels et de cadres une classe d'experts techniques une classe de « nouveaux aisés », et aux niveaux inférieurs de la structure de classe, en en plus d'une classe ouvrière traditionnelle vieillissante, d'un « précariat » caractérisé par de très faibles niveaux de capital et d'un groupe de travailleurs des services émergents. La fragmentation des secteurs intermédiaires de la structure sociale en factions distinctes séparées par des caractéristiques générationnelles, économiques, culturelles et sociales a été considérée comme notable par les auteurs de la recherche. [36] [37]

Élite Modifier

Les membres de la classe d'élite sont les 6 % les plus riches de la société britannique avec un capital économique très élevé (en particulier des économies), un capital social élevé et un capital culturel très « intelligent ». Les professions telles que les directeurs généraux, directeurs informatiques et télécommunications, directeurs marketing et commerciaux, directeurs et directeurs fonctionnels, notaires, avocats et juges, directeurs financiers, enseignants de l'enseignement supérieur, [38] dentistes, médecins et directeurs de la publicité et des relations publiques étaient fortement représentés. [39] Cependant, les personnes exerçant des professions établies et « acceptables », telles que les universités, le droit et la médecine, sont des identifiants plus traditionnels de la classe moyenne supérieure, l'informatique et la vente étant l'apanage de la classe moyenne économique sinon sociale.

Classe moyenne établie Modifier

Les membres de la classe moyenne établie, environ 25 % de la société britannique, ont signalé un capital économique élevé, un statut élevé de contacts sociaux moyens et un capital culturel élevé et émergent. Les professions bien représentées comprenaient les ingénieurs électriciens, les ergothérapeutes, les travailleurs sociaux, les sages-femmes, les professionnels de l'environnement, les professionnels de l'assurance qualité et de la réglementation, les responsables de l'urbanisme et les professionnels de l'enseignement spécialisé. [40]

Classe moyenne technique Modifier

La classe moyenne technique, environ 6 % de la société britannique, présente un capital économique élevé, un statut de contacts sociaux très élevé, mais relativement peu de contacts signalés, et un capital culturel modéré. Les professions représentées comprennent les radiographes médicaux, les pilotes d'avion, les pharmaciens, les professionnels des sciences naturelles et sociales et les physiciens, ainsi que les postes dans les affaires, la recherche et l'administration. [41]

Nouveaux travailleurs aisés Modifier

Les nouveaux travailleurs aisés, environ 15 % de la société britannique, présentent un capital économique modérément bon, un statut de contacts sociaux relativement faible, bien que très varié, et un capital culturel émergent modérément élevé mais bon. Les professions comprennent les électriciens et les monteurs électriciens les postiers les caissiers de détail et les caissiers de détail les plombiers et les techniciens de chauffage et de ventilation les assistants de vente et de détail les agents de logement les assistants de cuisine et de restauration les techniciens d'assurance qualité. [41]

Classe ouvrière traditionnelle Modifier

La classe ouvrière traditionnelle, environ 14% de la société britannique, présente un capital économique relativement faible, mais quelques actifs immobiliers, peu de contacts sociaux et un capital culturel faible et émergent. Les professions typiques comprennent les techniciens en électricité et en électronique les travailleurs de la santé les nettoyeurs les conducteurs de fourgons les électriciens les soins résidentiels, de jour et à domicile [41]

Secteur des services émergents Modifier

Le secteur émergent des services, environ 19% de la société britannique, présente un capital économique relativement faible, mais un revenu familial raisonnable, des contacts sociaux modérés, un capital culturel émergent (mais peu intellectuel). Les professions typiques comprennent le personnel de bar, les chefs, les infirmières auxiliaires et assistantes, les assembleurs et les agents de routine, les travailleurs sociaux, les professions élémentaires de stockage, les professions de service à la clientèle et les musiciens. [41]

Précariat Modifier

Le précariat, environ 15 % de la société britannique, affiche un faible capital économique et les scores les plus bas sur tous les autres critères. Les professions typiques comprennent les nettoyeurs, les chauffeurs de camionnettes, les travailleurs sociaux, les charpentiers et les menuisiers, les gardiens, les professions des services de loisirs et de voyage, les commerçants et propriétaires, et les caissiers de détail. [42]

Sous-classe Modifier

Le terme "sous-classe" est utilisé pour désigner les personnes qui sont "chômeurs chroniques", et dans de nombreux cas depuis des générations. [43]

Il existe une affirmation selon laquelle il existe des homologies entre le contexte de sens et la teneur du mot abusif « chav » et le terme « sous-classe » dans les discours médiatiques : la différence évidente étant que le premier concerne les dispositions supposées d'une classe sociale dans la consommation et le dernier aux difficultés d'une classe sociale dans les relations de travail productives. [44] Le conseiller spécial en éducation, Charlie Taylor, suit Michael Gove dans la conception d'une « sous-classe éducative », et a estimé que la majorité des personnes impliquées dans les émeutes d'Angleterre de 2011 pouvaient être considérées comme des membres. [45] Le journaliste de la BBC, Mark Easton, a estimé que, dans les réponses justificatives qu'il a entendues à la suite de ces émeutes, il serait facile de souscrire à la théorie de 2008 du politicien Iain Duncan Smith sur « une sous-classe » qui présentait « une expansion rampante ". [46] [47] [48]

Classe ouvrière Modifier

Classe ouvrière non qualifiée et semi-qualifiée Modifier

Traditionnellement, ces personnes auraient travaillé comme ouvriers manuels. Ils auraient généralement quitté l'école dès que la loi le leur permettait et n'auraient pas pu participer à l'enseignement supérieur. [49]

Beaucoup continueraient à travailler dans des emplois semi-qualifiés et non qualifiés dans l'extraction/la transformation des matières premières, dans l'assemblage et dans les ateliers d'usinage des principales usines automobiles, aciéries, mines de charbon, fonderies et usines textiles de Grande-Bretagne dans les villes et les villes très industrialisées. et des villages des West Midlands, du nord de l'Angleterre, du sud du Pays de Galles et des Lowlands écossais. Cependant, depuis le milieu des années 1970 et le début des années 1980, la désindustrialisation a brisé nombre de ces communautés, entraînant une détérioration complète de la qualité de vie et un renversement de l'augmentation du niveau de vie de la classe ouvrière industrielle. Beaucoup ont perdu leur statut de travailleur à faible revenu ou sont tombés dans une dépendance permanente à l'aide sociale. Certains ont complètement abandonné et ont rejoint l'économie du marché noir, tandis que quelques-uns ont réussi, souvent grâce à la fortune géographique d'autres industries de la région, à accéder à la classe moyenne inférieure.

Il a été avancé [50] qu'avec le déclin de l'industrie manufacturière et l'augmentation du secteur des services, les employés de bureau les moins bien payés appartiennent effectivement à la classe ouvrière. Les centres d'appels, en particulier, ont vu le jour dans d'anciens centres industriels. Cependant, depuis le début des années 2000, de nombreux centres d'appels ont tendance à fermer au Royaume-Uni et à sous-traiter leurs emplois en Inde et dans d'autres juridictions, dans le cadre de mesures de réduction des coûts. [51] [52]

Les groupes Mosaic 2010 où la proportion de résidents du niveau social D du SNIR a été classée « élevée » dans l'indice Mosaic 2010 sont les « résidents ayant des revenus suffisants dans un logement social à droit d'achat » et les « familles dans des logements sociaux de faible hauteur avec un niveaux de prestations nécessaires".

Les stéréotypes fictifs incluent : Andy Capp et Albert Steptoe, ce dernier n'est pas seulement lui-même sans aspiration mais écrase également les aspirations de son fils Harold.

Au cours de l'après-guerre, les Britanniques de la classe ouvrière blanche ont connu une forte augmentation de leur niveau de vie. Comme l'a noté Denys Blakeway en 2008 :

« La classe ouvrière blanche a énormément prospéré depuis la guerre. Elle a connu une croissance sans précédent de son revenu disponible et aujourd'hui, elle est maintenant plus riche que ses parents et grands-parents n'auraient jamais pu l'imaginer. Il y a des valeurs partagées dans la culture de la classe ouvrière blanche, mais je pense il est incroyablement difficile de mettre le doigt sur ce qui définit exactement la "classe ouvrière blanche" parce que beaucoup d'entre elles sont partagées par la classe moyenne, comme le football et le pub." [53]

Classe ouvrière qualifiée Modifier

Cette catégorie de personnes occuperait des emplois industriels ou des artisans qualifiés, traditionnellement dans l'industrie de la construction et de la fabrication, mais au cours des dernières décennies, le développement de l'entrepreneuriat a été présenté comme le stéréotype de l'homme blanc van ou des entrepreneurs indépendants. [54] Ces personnes parleraient avec des accents régionaux et auraient terminé des apprentissages d'artisanat plutôt qu'une formation universitaire. Le seul groupe Mosaic 2010 où la proportion de résidents de la catégorie sociale C2 du SNIR a été classée « élevée » dans l'indice Mosaic 2010 est celui des « résidents disposant de revenus suffisants dans un logement social en droit d'acheter ».[55]

Classe moyenne Modifier

Classe moyenne inférieure Modifier

La classe moyenne inférieure britannique se compose principalement d'employés de bureau. Au XIXe siècle, les classes moyennes et petites moyennes ont pu vivre en banlieue grâce au développement des omnibus et des chemins de fer hippomobiles. [56] Un politicien libéral radical (Charles Masterman), écrivant en 1909 a utilisé « les classes moyennes » et « les banlieues » de manière synonyme. [56] Au début du XXIe siècle, il n'y avait pas de groupes géodémographiques Mosaic 2010 où la proportion de résidents de la classe sociale C1 du NRS était classée comme « élevée » ou « faible » dans l'indice 2010, elle était classée comme « moyenne » dans tous les groupes Mosaic, [57] qu'ils soient de nature suburbaine, rurale, urbaine ou de petite ville.

Ils sont généralement employés dans des emplois du secteur des services relativement peu qualifiés (comme dans la vente au détail ou les agents de voyages), ou travaillent dans le gouvernement local ou sont propriétaires d'usines et d'autres bâtiments industriels. [ douteux - discuter ] Avant l'expansion de l'enseignement supérieur à partir des années 1960, les membres de cette classe n'avaient généralement pas de formation universitaire.

Les membres de la classe moyenne inférieure parlent généralement avec des accents locaux, bien que relativement doux. Les votes dans ce domaine sont divisés et les partis minoritaires auront une proportion plus forte. Le personnage de comédie Hyacinth Bucket est un stéréotype satirique pour ce groupe social.

Classe moyenne Modifier

La classe moyenne en Grande-Bretagne se compose souvent de personnes ayant fait des études supérieures et peut avoir été instruite dans des écoles publiques ou privées. [54]

Les emplois typiques incluent : les comptables, les architectes, les avocats, les géomètres, les travailleurs sociaux, les enseignants, les gestionnaires, les informaticiens spécialisés, les ingénieurs, les médecins, les infirmières diplômées et les fonctionnaires. Les écrans de consommation ostentatoire sont considérés comme vulgaires par eux, au lieu de cela, ils préfèrent canaliser les revenus excédentaires vers des investissements, en particulier l'immobilier.

Les membres de la classe moyenne sont souvent politiquement et socialement engagés (un sondage Mori en 2005 a révélé que 70 % des grades AB ont voté aux élections générales de 2005, contre 54 % des grades DE) et pourraient être des pratiquants réguliers (un sondage YouGov en 2014 a trouvé 62 % de ceux qui fréquentent l'église au moins une fois par mois étaient des grades NRS ABC1), [58] [59] pourraient siéger aux comités locaux et aux conseils d'administration ou se présenter à un poste politique. L'éducation est très appréciée par les classes moyennes : elles mettront tout en œuvre pour que leurs enfants obtiennent une place à l'université, elles pourront envoyer leurs enfants dans une école privée, embaucheront un tuteur à domicile en dehors des heures de classe pour que leur enfant apprenne plus vite taux, ou faire de grands efforts pour inscrire leurs enfants dans des lycées de bon état ou sélectifs tels que le déménagement dans la zone de chalandise. [60]

Ils valorisent également la culture et constituent une part importante du public acheteur de livres et fréquentant le théâtre. Ils lisent généralement des journaux grand format plutôt que des tabloïds. Le seul type géodémographique Mosaic 2010 où la proportion de résidents de la catégorie sociale B du SNIR a été classée comme « élevée » dans l'indice 2010 était « Personnes vivant dans des ensembles résidentiels neufs ». [57] Les classes moyennes en particulier d'Angleterre et du Pays de Galles sont souvent appelées "l'Angleterre du Milieu". [61]

Le personnage de comédie Margo Leadbetter est un stéréotype satirique pour ce groupe, tout comme Howard Weybridge de Jilly Cooper. [49]

Classe moyenne supérieure Modifier

La classe moyenne supérieure en Grande-Bretagne se compose généralement de personnes nées dans des familles qui ont traditionnellement des revenus élevés, bien que ce groupe soit davantage défini par le milieu familial que par l'emploi ou le revenu. Cette strate, en Angleterre, est traditionnellement bien parlée en utilisant nativement le dialecte de prononciation reçue. [ citation requise ]

La classe moyenne supérieure est traditionnellement scolarisée dans des écoles indépendantes, de préférence l'une des « écoles publiques » « majeures » ou « mineures » [63] [64] qui elles-mêmes ont souvent des pedigrees remontant à des centaines d'années et facturent des frais allant jusqu'à 33 000 £ par an et par élève (à partir de 2014). [62] [65]

Une minorité de familles de la classe moyenne supérieure peut également avoir des ancêtres qui les relient directement aux classes supérieures. Des armoiries en forme d'écusson peuvent dénoter ce statut passé. Un statut moindre historiquement directement pertinent pour la classe moyenne supérieure est celui d'écuyer ou de seigneur du manoir, cependant, ces droits de propriété ne sont plus [66] répandus.

Bien que de telles catégorisations ne soient pas précises, des exemples contemporains populaires de personnes de la classe moyenne supérieure peuvent inclure Boris Johnson, [67] Catherine, Duchess of Cambridge, [68] [69] [70] [71] David Cameron, [70] [ 72] et Matthew Pinsent (athlète).

Classe supérieure Modifier

La "classe supérieure" britannique est statistiquement très petite et se compose de la pairie, de la noblesse et des propriétaires terriens héréditaires, entre autres. Ceux qui possèdent une pairie héréditaire (mais pas une pairie à vie) par exemple, un duché, un marquisat, un comté, une vicomté, une baronnie, une baronnie ou un seigneur du parlement écossais sont généralement membres de la classe supérieure. [ citation requise ]

Traditionnellement, les enfants des classes supérieures étaient élevés à la maison par une nounou pendant les premières années de leur vie, puis scolarisés à domicile par des tuteurs privés. À partir de la fin du XIXe siècle, il est devenu de plus en plus populaire pour les familles de la classe supérieure d'imiter les classes moyennes en envoyant leurs enfants dans des écoles publiques, qui avaient été principalement fondées pour répondre aux besoins éducatifs de la classe moyenne. [ citation requise ]

De nos jours, lorsque les enfants sont assez grands, ils peuvent fréquenter une école préparatoire ou une école pré-préparatoire. En entrant dans l'enseignement secondaire, il est encore courant que les enfants des classes supérieures fréquentent une école publique, même s'il n'est pas rare que certaines familles envoient leurs enfants dans des écoles publiques. [73] Les objectifs de formation continue peuvent varier d'une famille à l'autre et peuvent, en partie, être fondés sur les antécédents scolaires de la famille. Dans le passé, l'armée britannique et la Royal Navy ont été les institutions de choix. De même, le clergé, ainsi que le monde universitaire, en particulier au sein des divisions des arts et des sciences humaines des universités les plus anciennes et les plus prestigieuses de Grande-Bretagne (Oxbridge), ont été des cheminements de carrière traditionnels parmi la classe supérieure - en effet, jusqu'en 1840, la majorité des diplômés d'Oxbridge étaient destinés à l'ordination. . [74]

Prononciation reçue Modifier

La prononciation reçue, également connue sous le nom de RP ou BBC English, était un terme introduit comme moyen de définir la norme Anglais, mais l'accent a acquis un certain prestige en étant associé aux classes moyennes (et supérieures) du Sud-Est, la partie la plus riche de l'Angleterre. L'utilisation de la RP par des personnes des « régions » en dehors du Sud-Est peut être révélatrice d'un certain niveau d'éducation, comme l'école publique ou les cours d'élocution.

"The Queen's English" était autrefois synonyme de RP. Cependant, la reine et certains autres membres plus âgés de l'aristocratie sont désormais perçus comme s'exprimant d'une manière à la fois plus démodée et de classe supérieure que le RP « général ». Les phonéticiens appellent cet accent « prononciation reçue conservatrice ». Cependant, la prononciation de la reine a également changé au fil des ans. Les résultats de l'étude Harrington et al. L'étude [75] peut être interprétée soit comme un changement, dans une plage normalement non perceptible, dans la direction du RP dominant d'un corpus de référence de lecteurs de nouvelles des années 1980, [76] ou montrant des changements subtils qui pourraient bien avoir été influencés par les voyelles de l'anglais de l'estuaire. [77]

L'anglais de la BBC était également synonyme de personnes RP à la recherche d'une carrière d'acteur ou de radiodiffusion une fois qu'elles avaient naturellement appris RP s'ils ne le parlaient pas déjà. Cependant, la BBC et d'autres radiodiffuseurs sont désormais beaucoup plus disposés à utiliser (en fait désireux d'utiliser) des accents régionaux. [77]

U et non U Modifier

U Non-U
Des légumes Légumes verts
Flairer Parfum
Cimetière Cimetière
Lunettes Lunettes
Fausses dents Dentiers
Serviette de table Serviette
Sofa Canapé ou alors canapé
Toilettes ou alors toilette Toilette
Déjeuner Dîner (pour le repas de midi)
Dîner Thé (pour le repas du soir)
Pudding Doux

La langue et le style d'écriture ont toujours été l'un des indicateurs de classe les plus fiables, bien que la prononciation ne soit devenue un tel indicateur qu'à la fin du XIXe siècle. Les variations entre la langue employée par les classes supérieures et les classes non supérieures ont peut-être été mieux documentées par l'article de 1954 du professeur de linguistique Alan Ross sur l'utilisation de l'anglais U et non U, avec "U" représentant le vocabulaire de la classe moyenne supérieure et supérieure de l'heure et « Non-U » représentant le vocabulaire de la classe moyenne inférieure. La discussion s'est poursuivie en Noblesse oblige et a présenté des contributions, entre autres, de Nancy Mitford. Le débat a été revisité au milieu des années 1970, dans une publication de Debrett's intitulée U et non-U revisités. Ross a également contribué à ce volume, et il est remarquable de remarquer à quel point la langue (parmi d'autres facteurs) a peu changé au cours d'un quart de siècle.

Dialecte régional anglais Modifier

En Angleterre, la classe supérieure ou le dialecte de prestige est presque toujours une forme de RP cependant, certaines régions ont leur « propre » dialecte de prestige, distinct à la fois du RP et du dialecte ouvrier de la région.

L'Angleterre a une plus grande variété de dialectes régionaux que les grands pays anglophones tels que l'Australie ou les États-Unis, et de nombreux dialectes anglais ont des connotations de classe ouvrière ou de classe moyenne inférieure. Cependant, il existe une tradition d'étude linguistique des dialectes en Angleterre et de nombreux membres des classes moyennes, comme Alexander John Ellis et Harold Orton, étaient fascinés par la linguistique du discours ouvrier. Arthur Balfour, homme politique du XIXe siècle et aristocrate, a fait un don financier important pour la production du Dictionnaire dialectal anglais, compilé par la classe ouvrière Joseph Wright. [78]

    l'accent du Yorkshire avec des variations considérables entre le nord, le sud, l'est et l'ouest de la région. l'accent et le dialecte de Manchester et des environs. – L'accent et le dialecte de Liverpool, particulièrement forts dans la population ouvrière du Merseyside. , le dialecte parlé à Barrow-in-Furness en Cumbria. fait référence au dialecte du comté traditionnel du Lancashire, en dehors de Manchester, Liverpool et Barrow. – L'accent et le dialecte de Birmingham. l'accent et le dialecte de Stoke-on-Trent et de la région des poteries environnantes.
  • Le dialecte Black Country des West Midlands, qui est similaire mais distinctif de Brummie. – Un accent et un dialecte du nord-est de l'Angleterre, en particulier de la région de Tyneside. – Un accent et un dialecte de Sunderland et des environs. - une variété d'accents et de dialectes similaires, mais sensiblement différents dans le sud-ouest de l'Angleterre, comme le dialecte bristolien qui est traditionnellement l'accent ouvrier de l'Est de Londres. Il a également des variations distinctes dans la grammaire et le vocabulaire.
  • L'accent de Londres est un accent de travail et de classe moyenne inférieur défini plus largement que Cockney. – Un accent de la classe ouvrière et de la classe moyenne inférieure du sud-est de l'Angleterre, essentiellement une forme plus douce (plus proche de R.P.) de l'accent londonien. Le terme était couramment utilisé dans les médias dans les années 1990, bien que la représentation médiatique ait été critiquée par des universitaires tels que Peter Roach[79] et Peter Trudgill[80] et le terme est maintenant moins courant. Dans cette région, il y avait auparavant le dialecte d'Essex, le dialecte du Kentish, le dialecte du Sussex et le dialecte du Surrey, mais ceux-ci sont maintenant rarement entendus, sauf parmi les résidents très âgés. est un terme utilisé dans les médias populaires pour une affectation délibérée de l'accent de la classe ouvrière londonienne (Cockney) par les gens de la classe moyenne pour gagner en « crédibilité dans la rue ». Cependant, les phonéticiens considèrent que l'infusion de caractéristiques Cockney dans la prononciation reçue chez les jeunes locuteurs est un processus naturel. (en abrégé MLE), familièrement appelé Jafaican, est un dialecte (et/ou sociolecte) de l'anglais qui a émergé à la fin du XXe siècle et est principalement utilisé par les jeunes gens du centre-ville et de la classe ouvrière du centre de Londres. On dit qu'il contient de nombreux éléments des langues des Caraïbes (Jamaïque et Trinité-et-Tobago), de l'Asie du Sud (sous-continent indien) et de l'Afrique de l'Ouest, [81] ainsi que des vestiges du Cockney traditionnel. [81]

Un citoyen anglais avec des armes inscrites au Collège des armes, ou un citoyen écossais au tribunal de Lyon, peut être qualifié d'armigerous. Tout citoyen britannique peut demander des armes à son autorité respective, mais seuls ceux qui ont un statut social suffisant se verraient octroyer des armes. [ citation requise ] Les armes en elles-mêmes sont imparfaitement alignées sur le statut social, dans la mesure où beaucoup de personnes de statut élevé n'auront pas droit aux armes tandis que, d'un autre côté, ceux qui ont droit aux armes par filiation peuvent inclure des branches de familles de n'importe où sur l'échelle sociale.

Néanmoins, un droit au port d'armes en vertu du droit des armes est, par définition, lié soit à l'acquisition personnelle d'un statut social, motivant la demande d'octroi personnel d'armes, soit à la descendance d'une personne qui l'a fait dans le passé. A tort ou à raison, l'usage d'un blason est donc lié au prestige social.

Au début du XXe siècle, des écrivains héraldiques tels qu'Arthur Charles Fox-Davies affirmaient que seuls ceux qui avaient droit à des armoiries pouvaient être correctement décrits (s'il s'agissait d'hommes) de gentilshommes et de statut noble, même à l'époque. cet argument était controversé, et il a été rejeté par d'autres écrivains tels qu'Oswald Barron et Horace Round. Dans l'Ordre de Malte, où la preuve de la noblesse technique est une exigence de certains grades d'adhésion, les membres britanniques doivent toujours fonder leur preuve sur un droit ancestral aux armoiries.

En 1941, George Orwell a écrit que la Grande-Bretagne était « la société la plus dominée par les classes sous le soleil ». [82]

Dans une interview en 1975 Helmut Schmidt, alors chancelier de l'Allemagne de l'Ouest a déclaré que :

Si l'on se demande quelles sont les vraies raisons du développement différencié des sociétés et des économies entre les Britanniques et la plupart des pays du continent, je pense que cela a quelque chose à voir avec le fait que la société britannique, bien plus que les sociétés scandinaves, allemandes, autrichiennes , et les sociétés néerlandaises, se caractérise par un type de société de lutte de classe. Cela est vrai pour les deux côtés de la classe supérieure ainsi que pour les classes ouvrières. Je pense que la manière dont les syndicats d'une part et la direction industrielle d'autre part ont traité leurs problèmes est dépassée.

Plus tard dans la même interview, Schmidt a noté que [83]

Vous devez traiter les travailleurs comme des membres égaux de la société. Il faut leur donner l'estime de soi qu'ils ne peuvent avoir que s'ils acquièrent des responsabilités. Vous pourrez alors demander aux syndicats de se comporter et de s'abstenir de ces politiques idiotes. Ensuite, ils accepteront des conseils de l'extérieur, du gouvernement, du parti ou de quoi que ce soit. Mais tant que vous maintenez la maudite société de classe qui est la vôtre, vous ne sortirez jamais de votre pétrin.


Notre blog

Une situation courante pour les applications basées sur une base de données est la nécessité de modifier les attributs d'une colonne. On peut changer le type de données, ou plus communément, uniquement la limitation de taille, par ex. VARCHAR(32) est changé en VARCHAR(42). Il existe plusieurs façons d'accomplir cela dans PostgreSQL, d'une simple colonne ALTER COLUMN, au remplacement de VARCHAR par TEXT (plus une contrainte de table), à ​​un piratage avancé du catalogue système.

L'exemple le plus courant d'un tel changement est l'extension d'une déclaration VARCHAR pour autoriser plus de caractères. Par exemple, votre colonne « checksum » était basée sur MD5 (à 32 caractères), et doit maintenant être basée sur Keccak (Keccak se prononce « catch-ack ») (à 64 caractères) En d'autres termes, vous avez besoin d'une colonne dans votre table pour passer de VARCHAR(32) à VARCHAR(64). L'approche canonique est de faire ceci :

Cette approche fonctionne bien, mais elle pose deux problèmes énormes et interdépendants : le verrouillage et le temps. Cette approche verrouille la table aussi longtemps que la commande prend pour s'exécuter. Et par serrure, nous parlons d'une lourde serrure « exclusive d'accès » qui exclut tout le reste de la table. Si votre table est petite, ce n'est pas un problème. Cependant, si votre table contient beaucoup de données, cela nous amène au deuxième problème : la réécriture de la table. La commande ci-dessus obligera Postgres à réécrire chaque ligne de la table, ce qui peut être une opération très coûteuse (à la fois en termes d'E/S de disque et de temps d'horloge murale). Ainsi, une solution simple ALTER COLUMN a généralement un coût très élevé pour les grandes tables. Heureusement, il existe des solutions à ce problème.

Tout d'abord, une bonne nouvelle : à partir de la version 9.2, de nombreuses opérations ne nécessiteront plus une réécriture complète de la table. Passer de VARCHAR(32) à VARCHAR(64) est une de ces opérations ! Ainsi, si vous avez la chance d'utiliser la version 9.2 ou supérieure de Postgres, vous pouvez simplement exécuter ALTER TABLE et la faire revenir presque instantanément. D'après les notes de version :

* Réduisez le besoin de reconstruire des tables et des index pour certains ALTER TABLE . Opérations ALTER COLUMN TYPE (Noah Misch)*

* *

L'augmentation de la limite de longueur d'une colonne varchar ou varbit, ou la suppression totale de la limite, ne nécessite plus de réécriture de table. De même, l'augmentation de la précision admissible d'une colonne numérique ou la modification d'une colonne de numérique contraint en numérique non contraint ne nécessite plus de réécriture de table. Les réécritures de table sont également évitées dans des cas similaires impliquant les types interval, timestamp et timestamptz.

Cependant, si vous n'êtes pas encore sur la version 9.2, ou si vous effectuez une opération non couverte ci-dessus (telle que la réduction de la taille limite d'un VARCHAR), votre seule option pour éviter une réécriture complète de la table est la modification du catalogue système ci-dessous. Cependant, avant de vous lancer, envisagez une autre option : abandonner complètement VARCHAR.

Dans le monde Postgres, il existe peu de différences entre les types de données VARCHAR et TEXT. Ce dernier peut être considéré comme un VARCHAR illimité, ou si vous préférez, un VARCHAR(999999999999). Vous pouvez également ajouter une contrainte de vérification à une table pour émuler la limite d'un VARCHAR. Par exemple, pour convertir une colonne VARCHAR(32) nommée « somme de contrôle » en une colonne TEXTE :

Le changement de type de données souffre du même problème de réécriture de table complète qu'auparavant, mais si vous utilisez la version 9.1 ou une version plus récente de Postgres, le changement de VARCHAR en TEXT ne ne pas faire une réécriture de table. La création de la contrainte de vérification, cependant, analysera toutes les lignes de table existantes pour s'assurer qu'elles remplissent la condition. Bien qu'elle ne soit pas aussi coûteuse qu'une réécriture complète d'une table, l'analyse de chaque ligne d'une grande table sera toujours coûteuse. Heureusement, la version 9.2 de Postgres vient à nouveau à la rescousse avec l'ajout de la phrase NOT VALID à la clause de contrainte de vérification. Ainsi, dans les versions plus récentes, vous pouvez éviter entièrement l'analyse en écrivant :

Il s'agit d'une exception unique pour la contrainte et ne s'applique que lors de la création de la contrainte. En d'autres termes, malgré le nom, la contrainte est tout à fait valide après sa création.Si vous souhaitez valider ultérieurement toutes les lignes que vous avez ignorées, vous pouvez utiliser la commande ALTER TABLE .. VALIDATE CONSTRAINT. Cela a le double avantage de permettre de retarder le contrôle jusqu'à un meilleur moment, et de prendre un verrou beaucoup plus léger sur la table que le ALTER TABLE .. ADD CONSTRAINT fait.

Alors, pourquoi vous donneriez-vous la peine de passer de votre colonne VARCHAR (32) à une colonne TEXT avec une contrainte CHECK ? Il y a au moins trois bonnes raisons.

Tout d'abord, si vous utilisez Postgres 9.2 ou une version supérieure, cela signifie que vous pouvez modifier les exigences de contrainte à la volée, sans analyse de table, même pour les situations « non optimales » telles que passer de 64 caractères à 32 caractères. l'ancienne contrainte et ajoutez-en une nouvelle avec la clause NOT VALID lancée dessus.

Deuxièmement, la contrainte de vérification donne un meilleur message d'erreur et une indication plus claire que la limitation a été construite avec une certaine réflexion derrière elle. Comparez ces messages :

Troisièmement, et le plus important, vous n'êtes plus limité à un seul attribut de colonne (longueur maximale). Vous pouvez également utiliser la contrainte pour vérifier de nombreuses autres choses : la taille minimale, le contenu réel, la correspondance des expressions régulières, etc. À titre d'exemple, si nous stockons vraiment des sommes de contrôle, nous voulons probablement que les sommes de contrôle hexadécimales de Keccak soient exactement 64 caractères, et pas seulement une longueur maximale de 64 caractères. Ainsi, pour illustrer le point ci-dessus sur le changement de contraintes à la volée, vous pouvez changer le VARCHAR (32) en TEXT et appliquer une limite stricte de 64 caractères avec :

Nous venons d'introduire un minimum et un maximum, quelque chose que le vieux VARCHAR ne pouvait pas faire. Nous pouvons le contraindre davantage, car nous ne devrions autoriser que le stockage de caractères hexadécimaux. Ainsi, nous pouvons également refuser l'ajout de caractères autres que 0123456789abcdef :

Puisque nous avons déjà ajouté un contrôle regex, nous pouvons réduire la taille du CHECK avec un petit coup de clarté comme ceci :

Mais revenons à l'autre problème : comment éviter une réécriture de table lors du passage de VARCHAR(64) à VARCHAR(32), ou lorsqu'on est bloqué sur une ancienne version de Postgres qui insiste toujours sur une réécriture de table ? La réponse est les catalogues système. Veuillez noter que toute mise à jour des catalogues système doit être effectuée très, très soigneusement. C'est l'un des rares types de mise à jour que je mentionnerai publiquement et que je cautionnerai. N'appliquez pas cette leçon à une autre table ou colonne système, car il peut y avoir de graves conséquences imprévues.

Alors, qu'est-ce que cela signifie d'avoir VARCHAR(32) contre VARCHAR(64) ? Il s'avère qu'il n'y a aucune différence dans la façon dont les données de la table réelle sont écrites. La limite de longueur d'un VARCHAR est simplement une contrainte de vérification implicite, après tout, et en tant que telle, elle est assez facile à modifier.

Créons une table et examinons certains des champs importants de la table système pg_attribute. Dans ces exemples, nous utiliserons Postgres 8.4, mais les autres versions devraient être très similaires — cette partie du catalogue système change rarement.

La colonne importante est atttypmod. Il indique la longueur légale de cette colonne varchar (dont le nom légal complet est "caractère variable", mais tout le monde l'appelle varchar). Dans le cas de Postgres, il y a aussi 4 caractères d'overhead. Donc VARCHAR(32) apparaît comme 36 dans la colonne atttypmod. Ainsi, si nous voulons le changer en VARCHAR(64), nous ajoutons 4 à 64 et obtenons un nombre de 68. Avant de faire ce changement, cependant, nous devons nous assurer que rien d'autre ne sera affecté. Il existe d'autres dépendances à prendre en compte, telles que les vues et les clés étrangères, que vous devez garder à l'esprit avant d'effectuer cette modification. Ce que vous devez faire est de vérifier soigneusement toutes les dépendances de cette table :

Nous pouvons voir dans ce qui précède que la seule dépendance est une entrée dans la table pg_type — ce qui est une chose normale pour toutes les tables et ne causera aucun problème. Toute autre entrée, cependant, devrait vous donner une pause avant de faire une mise à jour manuelle de pg_attribute. Vous pouvez utiliser les informations renvoyées par la première colonne de la requête ci-dessus pour voir exactement ce qui fait référence à la table. Par exemple, rendons cette colonne unique, ajoutons une vue qui utilise la table, puis voyons les effets sur la table pg_depend :

Les "i", "a" et "n" signifient interne, automatique et normal. Ils ne sont pas trop importants dans ce contexte, mais plus de détails peuvent être trouvés dans la documentation de la table pg_depend. La première colonne nous montre la table système et l'oid de la dépendance, afin que nous puissions les rechercher et voir ce qu'ils sont :

Alors qu'est-ce que tout cela nous dit ? Il nous dit que nous devons examiner attentivement l'index et la vue pour nous assurer qu'ils ne seront pas affectés par le changement. Dans ce cas, un simple index sur la colonne ne sera pas affecté par la modification de la longueur, il (ainsi que l'entrée pg_type) peut donc être ignoré. Cependant, la vue doit être recréée afin qu'elle enregistre la taille réelle de la colonne.

Nous sommes maintenant prêts à effectuer le changement réel. Ce serait un excellent moment pour faire une sauvegarde de votre base de données. Cette procédure doit être effectuée très soigneusement — si vous n'êtes pas sûr de l'une des entrées de pg_depend, ne continuez pas.

Tout d'abord, nous allons démarrer une transaction, verrouiller la table et supprimer la vue. Ensuite, nous allons modifier directement la longueur du varchar, recréer la vue et valider ! Nous y voilà:

Vérifiez les modifications et consultez les entrées pg_depend :

Succès. La table et la vue affichent la nouvelle taille VARCHAR, mais les données de la table n'ont pas été réécrites. Notez comment la dernière ligne renvoyée par la requête pg_depend a changé : nous avons supprimé la vue et en avons créé une nouvelle, résultant en une nouvelle ligne à la fois dans pg_class et pg_rewrite, et donc un nouvel OID affiché dans la table pg_rewrite.

Espérons que ce n'est pas quelque chose que vous devez effectuer. Les nouvelles fonctionnalités de 9.1 et 9.2 qui empêchent les réécritures de table et l'analyse de table devraient y contribuer grandement.


Fonctionnalité de débordement de pile pour les équipes

Nous sommes ravis d'être si près de expédition des oneboxes GitHub publiques sur Stack Overflow pour les équipes. Cette fonctionnalité était très demandée par nos utilisateurs Teams et sera incluse dans notre prochaine version pour nos clients de niveau Entreprise.

Nous avons conçu la fonctionnalité en pensant à Stack Overflow afin de pouvoir (avec un minimum d'effort) la déployer plus largement. Nous n'avons pas encore de calendrier exact pour Stack Overflow ou le réseau, mais nous les partagerons quand nous le ferons.

À ce stade, la fonctionnalité a déjà suivi notre processus d'assurance qualité interne et est prête à être expédiée pour nos utilisateurs de Stack Overflow pour Teams, mais nous voulions faire une série rapide de tests d'acceptation des utilisateurs avec vous avant la prochaine version.

Si vous avez l'occasion de donner un coup de pied aux pneus, nous aimerions savoir si vous découvrez des bugs ou des cas de bord que nous avons peut-être manqués.

Je répondrai à vos questions, commentaires, bugs ou suggestions que vous avez concernant votre expérience avec la fonctionnalité la meilleure. Les commentaires et les demandes de fonctionnalités seront pris en compte pour les futures itérations.

En ce qui concerne la fonctionnalité elle-même, vous pourrez coller des liens vers des éléments essentiels, des commits, des blobs et des PR et ils devraient être automatiquement intégrés. Le lien que vous utilisez doit être seul et sur sa propre ligne. Vous trouverez ci-dessous des exemples de ce que vous devriez voir.