Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add: Scope Notion - FR #51

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions prog_orientee_objet/miscellaneous/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Divers

Cette catégorie comprend les notions diverses en rapport avec la programmation orientée objet.

## Table des matières

- [Scope - Notion, définition et exemples](fr/SCOPE.md)

# Miscellaneous

This category contains miscellaneous notions about object oriented programmation.
Hokkaydo marked this conversation as resolved.
Show resolved Hide resolved

## Table of contents
163 changes: 163 additions & 0 deletions prog_orientee_objet/miscellaneous/fr/SCOPE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
# Scopes

> :information_source: Les exemples de code sont rédigés en Java

Cette fiche est une définition de la notion de `scope`. Elle réapparaît dans de nombreuses notions et il est nécessaire qu'elle soit comprise afin de poursuivre la lecture d'autre fiches.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Petite typo

Suggested change
Cette fiche est une définition de la notion de `scope`. Elle réapparaît dans de nombreuses notions et il est nécessaire qu'elle soit comprise afin de poursuivre la lecture d'autre fiches.
Cette fiche est une définition de la notion de `scope`. Elle réapparaît dans de nombreuses notions et il est nécessaire qu'elle soit comprise afin de poursuivre la lecture d'autres fiches.


`Scope` est la traduction anglaise du mot `contexte`. Il définit la portée d'une variable.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je ne suis pas d'accord avec ça, scope n'est pas la traduction de « contexte » mais bien de « portée »

Suggested change
`Scope` est la traduction anglaise du mot `contexte`. Il définit la portée d'une variable.
`Scope` est la traduction anglaise du mot `portée`. Ainsi, quand on parle de `scope`, on parle de la zone dans laquelle est définie une variable, de sa portée.


Il y en a 2 :

• [Local](#Local)

• [Global](#Global)
Comment on lines +9 to +13
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Il y en a 2 :
[Local](#Local)
[Global](#Global)
Il y en a 2 :
- [Local](#Local)
- [Global](#Global)


## Local

Le `scope` local se réfère à un bloc de code.

Tout ce qui est délimité par 2 accolades (`{}`) est considéré comme un bloc. Cela comprend donc toutes les méthodes (constructeurs y compris car rappelez vous qu'un constructeur n'est qu'une méthode un peu particulière) mais également les structures de code (boucles `for`, boucle `while`, `if` conditionels, etc...).
Hokkaydo marked this conversation as resolved.
Show resolved Hide resolved

Définir une variable dans un bloc, signifie qu'elle n'est accessible que dans le corps de ce bloc et uniquement dans celui ci.
Hokkaydo marked this conversation as resolved.
Show resolved Hide resolved

En dehors, cette variable n'existe pas.

Essayer de l'appeler ou de l'utiliser provoquera une valeur nulle voire une erreur.

```java
public void aRandomMethod() {
String name = "John";
System.out.println(name);
//output : John
}
System.out.println(name); //erreur à la compilation, variable introuvable
```

Une fois le corps de méthode exécuté, cette variable n'existe plus et est détruite.

C'est utile dans le cas où l'on souhaite réutiliser le même nom plusieurs fois dans différentes méthodes.

```java
public void aRandomMethod() {
String name = "John";
System.out.println(name); //output : John
}
public void aSecondRandomMethod() {
String name = "Bob";
System.out.println(name); //output : Bob
}
System.out.println(name); //erreur à la compilation, variable introuvable
```

*Et dans le cas d'un bloc :*
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Le contenu d'une fonction est déjà défini par un bloc de code en soi, donc il s'agit déjà d'un scope local déterminé par un bloc.
Enfin, du moins c'est ce qui me semble évident, contredisez moi si vous pensez le contraire 🤷

Suggested change
*Et dans le cas d'un bloc :*
*Autre exemple :*


```java
public void aRandomMethod() {
String name = "John";
System.out.println(name); //output : John
if(5 + 4 == 9) {
boolean isCorrect = true;
System.out.println(isCorrect); //output : true
}else {
Comment on lines +58 to +61
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if(5 + 4 == 9) {
boolean isCorrect = true;
System.out.println(isCorrect); //output : true
}else {
if (5 + 4 == 9) {
boolean isCorrect = true;
System.out.println(isCorrect); //output : true
} else {

boolean isCorrect = false;
System.out.println(isCorrect); //output : false
}
System.out.println(isCorrect); //erreur à la compilation, variable introuvable
}
```

## Global

Le `scope` global se réfère, lui, à un milieu plus large : la classe dans laquelle la variable se trouve.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

La notion de scope n'est pas spécifique au paradigme orienté objet, du coup j'ai un petit problème avec cette phrase.
Le Java est vraiment un mauvais exemple pour parler de scope global, car il n'y en a pas.
Les classes servent de namespace, du coup on ne peut pas réellement polluer le scope global, vu que même des constantes (public static final String trucRandom = "LOL";) seront scopées dans la classe dans laquelle elles sont définies.


Une variable définit avec un `scope` global sera accessible partout dans la classe y compris dans les méthodes.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Une variable définit avec un `scope` global sera accessible partout dans la classe y compris dans les méthodes.
Une variable définie avec un `scope` global sera accessible partout dans la classe y compris dans les méthodes.


Eh oui, le `scope global` englobe le `scope local`.

Vous pouvez donc utiliser une variable `globale` dans une méthode, elle ne sera pas détruite après l'exécution du corps de la méthode.

```java
public class MyClass {
private int number = 3;
private int anotherNumber = number + 4;
public void aMethod() {
System.out.println(number);
//output : 3
System.out.println(anotherNumber);
//output : 7
System.out.println(anotherNumber + 7);
//output : 14
}
}
Comment on lines +77 to +91
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Il ne s'agit pas là de variables globales, mais de variables d'instance.
Cet exemple est donc faux.

```

## This

Concernant le nommage des variables dans les scopes, il est impossible d'avoir deux variables du même nom dans un seul scope :

```java
public class MyClass {
private int number = 7;
private int number = 8; //erreur : Variable déjà initialisée
public void aRandomMethod() {
String name = "John";
String name = "Bob"; //erreur : Variable déjà initialisée
}
}
```

Cependant, il est possible d'avoir 2 variable du même nom dans 2 scopes différents :
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Cependant, il est possible d'avoir 2 variable du même nom dans 2 scopes différents :
Cependant, il est possible d'avoir 2 variables du même nom dans 2 scopes différents :


```java
public class MyClass {
private String name = "John";
public void aRandomMethod() {
String name = "Bob";
System.out.println(name);
//output : Bob
}
}
```

Comme vous le voyez ici, c'est la variable au scope le plus restreint qui prime. Dans cette méthode, la valeur `John` ne sera jamais utilisée.

Cependant, il existe un moyen de référencer la variable de classe, celle avec un `scope` global.

Ce moyen dépend d'un mot clé. En Java on utilisera `this`. En PHP ce sera au moyen d'un tableau global (`$GLOBALS`) etc...
Hokkaydo marked this conversation as resolved.
Show resolved Hide resolved

### Java

En le plaçant devant la variable, on référence la variable ayant le `scope` le plus général.

Il devient donc possible de faire ça :

```java
public class MyClass {
private String message = "Hello ";
public void aRandomMethod() {
String message = "World";
System.out.println(this.message + message);
//output : Hello World
}
}
```

## Conclusion

Voilà qui conclut cette fiche sur le concept de `scope`.

Globalement, retenez que :

- Il y a 2 scopes :

- Local :

- Défini au sein d'un bloc (méthode, `if`, `for`, etc ...)

- Variables temporaires, détruites une fois le bloc passé

- Global :

- Défini pour toute la classe

- Accessible localement via un mot-clé, uk tableau etc...
Hokkaydo marked this conversation as resolved.
Show resolved Hide resolved