Your codebase is tightly coupled, and you the team members aren’t happy about it.
Okay.. maybe you do not even know what tight and loose coupling mean.
Tight are loosed coupling are terms that are used to describe the relationship between components of an application.
Dependency Injection, in one sentence — as defined by James Shore, is:
Giving an object its instance variables.
Before going further, you may want to ask what a dependency is.
In a simple term, dependencies are object that a class depends on.
the object could be a string, integer, array, or anything!
Now, let’s get to learning about dependecy injection, and how it’s used.
Supposed you’re tasked to build a application for students in the university, and in that application, each student should have access to the certain features, e.g courses they offer, announcements made by the class prefect, and their CGPA.
Irrespective of the programming language you code with, you may start to create the solution as a class with all the features as properties of that class.
// students.ts
class Students {
private readonly name = "Emmmanuel Odii";
private readonly CGPA = 3.0;
private announcements = ["lecture holds at 9am", "pay your dues!"];
private courses = [{name: "maths", instructor: "John Doe", schedue: "today at 2am"}];
}
This is a great way to start building out such application, but suppose we’re in an environment where students needs different values based on their name, this becomes difficult to work with.
Suppose we had to edit the CGPA value, the updated CGPA value gets applied to all the students using the application, and this by definition, is called, tight coupling. because the Students class is tightly coupled with the CGPA value.
The best way to fix this would be to have the Students class receive information about the student, and work it the information that it receives.
Now, this is called dependency injection.
If you remember, from our definition of dependency injection, it simply means giving a class it’s instance variables.
With dependency injection, the changes gets executed at runtime, rather than compile time.
There are various type of dependency injection, and the most common of all is constuctor injection.
In short, Constructor Injection means giving an class its instance variables via its constructors.
That being said, we can now obtain the properties of a student via it’s constructor.
class Student {
constructor(
private readonly name: string,
private readonly CGPA: number,
private announcements: string[],
private courses: { name: string, instructor: string, schedule: string }[]
) {}
}
And we can perform certain actions with the students information, which will in-turn make the Student class very useful.
An example of that would be to give a student the ability to retrieve a particlular course.
class Student {
constructor(
private readonly name: string,
private readonly CGPA: number,
private announcements: string[],
private courses: { name: string, instructor: string, schedule: string }[]
) {
getCourse(courseName: string){
const course = this.courses.find(course => course.name === courseName);
return course ? { ...course } : null;
}
}tt
}
There, we have dependency injection in action. there’s nothing more complex to it.
Advantages of Dependency Injection
- Decoupling: as we explored in the example above, the component becomes easier to maintiain as we were able to inject the dependencies from outside the class.
- Testability: with dependency injection, it is easier to test components in isolation by providing a mock implementations of dependencies.
- Scalability: when a new dependency is added, it doesn’t affect the rest of the system. this makes it easy to extend the functionality of the application.
- It’s a part of the SOLID principles, and every developer wants to employ that principle in their codebase 😉
Edit 1:
- If you’re a student, or you own a school, I’m working on betastudents, a platform for students to learn interactively, please check it out, and feel free to ping me on twitter if there’s anything specific that you’d like me to build for you.
Also, if you want something custom for students in your school, you can also send me an email so that we get to talk about it.
Edit 2:
- If you’re looking for a community to grow as a developer, then you should come hang with us at wecraftcode.
We are a small group of people who leverage learning and programming through motivation, mentoring, and craftsmanship.