# Oefeningen
# Herschrijf de code
Pas de projectarchitectuur toe om de code meer modulair, leesbaar en onderhoudbaar te maken. Vereisten:
Data Module (data.js): Creëer een module voor gegevensgerelateerde operaties. Implementeer functies om gegevens te initialiseren, gegevens te verwerken en toegang te bieden tot de verwerkte gegevens.
Verwerkingsmodule (processing.js): Creëer een module om de logica voor gegevensverwerking af te handelen. Implementeer functies om gegevens op een duidelijke en begrijpelijke manier te verwerken. Overweeg het scheiden van speciale verwerkings- en geavanceerde verwerkingslogica.
Rapportagemodule (reporting.js): Creëer een module die verantwoordelijk is voor het weergeven van rapporten. Implementeer functies om gegevens en verschillende statistieken op een goed geformatteerde manier weer te geven.
Hoofdscript (main.js): Refactor het hoofdscript om gebruik te maken van de hierboven gemaakte modules. Initialiseer gegevens met behulp van de Data Module, verwerk gegevens met behulp van de Processing Module en geef rapporten weer met behulp van de Reporting Module.
Tips:
- Zorg ervoor dat elke module een duidelijke verantwoordelijkheid heeft.
- Gebruik functieparameters en retourwaarden om te communiceren tussen modules.
- Vermijd zoveel mogelijk het gebruik van globale variabelen.
- Sluit logica in functies in om de leesbaarheid te verbeteren.
- Test elke module onafhankelijk voordat je ze integreert in het hoofdscript.
Voorbeeldmodulestructuur:
project/
|-- data.js
|-- processing.js
|-- reporting.js
|-- main.js
2
3
4
5
// This intentionally longer and more intricate script
// has no functions for students to refactor.
const data = [];
// Generate even more random data with additional properties
for (let i = 0; i < 25; i++) {
data.push({
id: i,
value: Math.floor(Math.random() * 100),
category: i % 2 === 0 ? "Even" : "Odd",
isSpecial: i % 3 === 0,
details: {
importance: Math.floor(Math.random() * 5) + 1,
complexity: Math.floor(Math.random() * 10) + 1,
},
});
}
// Apply more confusing processing logic to data
data.forEach((item) => {
if (item.isSpecial) {
if (item.value > 30 && item.value <= 70) {
item.specialResult = "Intermediate Special";
} else {
item.specialResult = "Extreme Special";
}
} else {
item.specialResult = "Not Special";
}
// Apply additional complex logic based on details
if (item.details.importance > 3) {
if (item.details.complexity > 5) {
item.advancedResult = "High Importance, High Complexity";
} else {
item.advancedResult = "High Importance, Low Complexity";
}
} else {
item.advancedResult = "Low Importance";
}
});
// Display even more obscure data formatting
console.log("Even More Extended Data Processing Report:");
console.log("===========================================");
data.forEach((item) => {
console.log(
`ID: ${item.id}, Value: ${item.value}, Category: ${item.category}, Special Result: ${item.specialResult}, Advanced Result: ${item.advancedResult}`
);
});
// Calculate additional confusing statistics
let highImportanceCount = 0;
let lowImportanceCount = 0;
data.forEach((item) => {
if (item.details.importance > 3) {
highImportanceCount++;
} else {
lowImportanceCount++;
}
});
console.log("\nEven More Additional Confusing Statistics:");
console.log("===========================================");
console.log(`High Importance Count: ${highImportanceCount}`);
console.log(`Low Importance Count: ${lowImportanceCount}`);
console.log(
`High Importance Percentage: ${(highImportanceCount / data.length) * 100}%`
);
console.log(
`Low Importance Percentage: ${(lowImportanceCount / data.length) * 100}%`
);
// Introduce more complex operations on the data
let highComplexityCount = 0;
let lowComplexityCount = 0;
data.forEach((item) => {
if (item.details.complexity > 5) {
highComplexityCount++;
} else {
lowComplexityCount++;
}
});
console.log("\nAdvanced Complexity Summary:");
console.log("===========================");
console.log(`High Complexity Count: ${highComplexityCount}`);
console.log(`Low Complexity Count: ${lowComplexityCount}`);
console.log(
`High Complexity Percentage: ${(highComplexityCount / data.length) * 100}%`
);
console.log(
`Low Complexity Percentage: ${(lowComplexityCount / data.length) * 100}%`
);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# Refactor the code
Verdeel de code in modules en herschrijf de code om de modules te gebruiken.
Tips:
- Houd elke module gericht op een specifieke taak.
- Maak gebruik van functies om de leesbaarheid te vergroten.
- Minimaliseer het gebruik van globale variabelen.
- Test elke module afzonderlijk voordat je deze integreert in het hoofdscript.
// Ongeorganiseerd en complex script voor bibliotheekbeheer
const books = [];
const members = [];
const loans = [];
// Boeken toevoegen
books.push({
id: 1,
title: "The Catcher in the Rye",
author: "J.D. Salinger",
genre: "Fiction",
});
books.push({
id: 2,
title: "To Kill a Mockingbird",
author: "Harper Lee",
genre: "Drama",
});
books.push({
id: 3,
title: "1984",
author: "George Orwell",
genre: "Dystopian",
});
books.push({
id: 4,
title: "The Great Gatsby",
author: "F. Scott Fitzgerald",
genre: "Classics",
});
// Leden toevoegen
members.push({ id: 101, name: "Alice Johnson", membershipType: "Premium" });
members.push({ id: 102, name: "Bob Smith", membershipType: "Basic" });
members.push({ id: 103, name: "Eve Williams", membershipType: "Premium" });
// Uitleningen uitvoeren
loans.push({
bookId: 1,
memberId: 101,
dueDate: "2023-05-01",
returned: false,
});
loans.push({
bookId: 2,
memberId: 102,
dueDate: "2023-04-15",
returned: false,
});
loans.push({
bookId: 3,
memberId: 103,
dueDate: "2023-06-01",
returned: false,
});
// Simuleer enkele boeken die zijn teruggebracht
loans[0].returned = true;
loans[2].returned = true;
// Weergave van boeken
console.log("Boekenlijst:");
console.log("============");
books.forEach((book) =>
console.log(
`ID: ${book.id}, Titel: ${book.title}, Auteur: ${book.author}, Genre: ${book.genre}`
)
);
// Weergave van leden
console.log("\nLedeninformatie:");
console.log("=================");
members.forEach((member) =>
console.log(
`ID: ${member.id}, Naam: ${member.name}, Lidmaatschap: ${member.membershipType}`
)
);
// Weergave van uitleningen
console.log("\nUitleningen:");
console.log("============");
loans.forEach((loan) => {
const book = books.find((b) => b.id === loan.bookId);
const member = members.find((m) => m.id === loan.memberId);
console.log(
`Boek: ${book.title}, Lid: ${member.name}, Vervaldatum: ${loan.dueDate}, Geretourneerd: ${loan.returned}`
);
});
// Bereken het aantal uitgeleende boeken per lid
const loansPerMember = {};
loans.forEach((loan) => {
loansPerMember[loan.memberId] = (loansPerMember[loan.memberId] || 0) + 1;
});
// Weergave van het aantal uitgeleende boeken per lid
console.log("\nAantal uitgeleende boeken per lid:");
console.log("==================================");
Object.keys(loansPerMember).forEach((memberId) => {
const member = members.find((m) => m.id == memberId);
console.log(`${member.name}: ${loansPerMember[memberId]} boeken`);
});
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# Bestandsbeheer met ‘fs’
Maak een programma dat de inhoud van een tekstbestand leest ('leesbestand.txt') en de gegevens in de console weergeeft.
# Padmanipulatie met ‘path’
Construeer een functie die twee paden combineert tot een nieuw pad. Bijvoorbeeld, combineer het pad '/gebruiker/naam' met 'documenten/bestand.txt' tot '/gebruiker/naam/documenten/bestand.txt'.
# Mapnavigatie met ‘fs’ en ‘path’
Schrijf een programma dat alle bestanden in een specifieke map ('/pad/naar/mappen/') oplijst, waarbij ook wordt aangegeven of elk item een bestand of een map is.
# Bestandscreatie en schrijven met ‘fs’
Ontwikkel een programma dat een nieuw tekstbestand ('nieuwbestand.txt') aanmaakt en er wat inhoud naar schrijft, zoals een eenvoudige begroeting.
# Bestandsbeheermodule
Maak een module genaamd ‘file-management.js’ met functies voor het lezen en schrijven van gegevens naar een tekstbestand. Importeer deze module in main.js en gebruik deze om gegevens naar een bestand te schrijven en ze vervolgens weer uit te lezen.
# Logboekapplicatie
Ontwikkel een module met de naam ‘logboek’, waarin functies zijn opgenomen om logboekberichten op diverse niveaus (bijvoorbeeld info, waarschuwing, fout) vast te leggen. Exporteer deze functies en implementeer ze in een hoofdprogramma om verschillende logboekberichten te genereren en op te slaan in een logbestand.
In het hoofdprogramma moet je try-catch gebruiken en een Promise uitvoeren. Als een Promise succesvol wordt afgehandeld, genereer dan een infobericht in het logboek. Als er een fout optreedt tijdens het afhandelen van de Promise, sla dan de foutmelding op in het logboek.
logging.js
function createInfoMessage() {} // Schrijft foutmelding in een bestand en maakt duidelijk dat dit van het info type is.
function createWarningMessage() {} // Type waarschuwing
function createErrorMessage() {} // Type Error
2
3
# Pakketinstallatie
Installeer het pakket 'lodash' met npm in een nieuw Node.js-project. Gebruik vervolgens een van de functionaliteiten van lodash in je hoofdprogramma om een array om te keren.
# Scripting
Voeg een npm-script toe met de naam start aan je project. Dit script zal het bestand app.js moeten uitvoeren. Voer het script uit in de terminal.