Comportements OTP personnalisés
Comprenez la structure des comportements OTP et apprenez à créer vos propres comportements génériques personnalisés afin d'encapsuler des modèles courants
Comportements OTP personnalisés est une leçon Erlang OTP: Distributed & Fault-Tolerant Systems Programming gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Erlang OTP: Distributed & Fault-Tolerant Systems Programming, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Erlang OTP: Distributed & Fault-Tolerant Systems Programming comprend 4 leçons au total.
Certaines parties de cette leçon n'ont pas encore été traduites et s'affichent en anglais.
Intro: What are OTP Behaviors?
You've learned about OTP behaviors like GenServer and GenStatem. They provide a standard way to build robust, fault-tolerant components.
But what if you have a recurring pattern that isn't perfectly covered by existing behaviors? This is where custom OTP behaviors come in handy!
They let you define your own generic component structure.
Why Custom Behaviors?
Creating custom behaviors offers several key advantages:
- Code Reuse: Encapsulate common logic once and reuse it across many modules.
- Consistency: Ensure all components following your behavior adhere to a specific interface and structure.
- Abstraction: Hide complex internal details, exposing a simpler API to users.
- Maintainability: Changes to the core logic only need to happen in one place.
Anatomy of a Behavior
An OTP behavior typically consists of two main parts:
- The Behavior Module: This module defines the public interface (functions users call) and often provides helper functions for the callback module. It uses the
-behaviour(gen_server)or similar attribute to link to a generic server. - The Callback Module: This is where the actual logic lives. It implements the callback functions (like
init/1,handle_call/3) required by the behavior module.
Think of it as a contract between the two.
Behavior Module: Interface
The "behavior module" is what other modules -behaviour(...) against. For custom behaviors, you'll often define a module that wraps an existing generic behavior (like gen_server) but adds your specific API.
It acts as the client-side interface for users of your custom behavior.
Key aspects:
- Defines the public functions (e.g.,
start_link/0,my_action/1). - These functions typically call
gen_server:start_link/3orgen_server:call/2internally. - It specifies the callback module using the
-callbackattribute.
Callback Module: Logic
The "callback module" is where the core functionality of your custom behavior resides. It's the module that actually implements the required functions defined by the underlying generic behavior (like gen_server or gen_statem).
- It must implement functions like
init/1,handle_call/3,handle_cast/2, etc. - These functions manage the state and respond to messages.
- This module is what the behavior module (e.g.,
gen_server) calls directly.
Counter Behavior: Start
Let's create a simple custom counter behavior. We'll wrap a gen_server to manage an integer count.
First, define the behavior module, which acts as the client API and starts the underlying gen_server.
-module(my_counter).
-behaviour(gen_server). % We wrap gen_server
-export([start_link/0, get_count/0, increment/0, decrement/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
% Public API for starting the counter
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
% --- gen_server callbacks (for *this* module acting as callback) ---
% This is where the initial state is set
init([]) ->
{ok, 0}. % Initial count is 0Counter Behavior: Functions
Now, let's add the public functions to interact with our counter (increment, decrement, get_count) and implement their corresponding handle_call logic.
These public functions will use gen_server:call/2 to send requests to the actual counter process.
-module(my_counter).
-behaviour(gen_server).
-export([start_link/0, get_count/0, increment/0, decrement/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
% Public API for interacting with the counter
get_count() ->
gen_server:call(?MODULE, get_count).
increment() ->
gen_server:call(?MODULE, increment).
drcrement() ->
gen_server:call(?MODULE, decrement).
% --- gen_server callbacks ---
init([]) ->
{ok, 0}.
handle_call(get_count, _From, State) ->
{reply, State, State};
handle_call(increment, _From, State) ->
NewState = State + 1,
{reply, NewState, NewState};
handle_call(decrement, _From, State) ->
NewState = State - 1,
{reply, NewState, NewState};
handle_call(_Request, _From, State) ->
{reply, {error, unknown_request}, State}.
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.Using the Custom Counter
With our my_counter behavior defined, we can now easily use it from an Erlang shell or another module. Notice how simple the client-side code is!
You don't need to know the gen_server details; you just use the custom behavior's API.
-module(counter_app).
-export([run/0]).
run() ->
% Start our custom counter behavior
io:format("Starting counter...~n"),
my_counter:start_link(),
io:format("Current count: ~p~n", [my_counter:get_count()]),
io:format("Incrementing...~n"),
my_counter:increment(),
io:format("Current count: ~p~n", [my_counter:get_count()]),
io:format("Decrementing...~n"),
my_counter:decrement(),
io:format("Current count: ~p~n", [my_counter:get_count()]),
% Stop the counter (optional, usually supervisors handle this)
gen_server:stop(my_counter),
io:format("Counter stopped.~n").When to Use Custom Behaviors
Custom OTP behaviors are powerful, but not every component needs one. Consider creating a custom behavior when:
- You find yourself writing similar
gen_serverorgen_statemboilerplate repeatedly. - You want to enforce a specific pattern or interface across multiple components.
- You need to provide a simpler, higher-level API for a complex underlying process.
- You are building a reusable library or framework component.
Quick Check
You've learned about custom OTP behaviors. Let's test your understanding.
Recap & Next Steps
You've explored the world of custom OTP behaviors!
- We saw that custom behaviors allow you to encapsulate common patterns.
- They typically consist of a **behavior module** (public API) and a **callback module** (logic).
- By wrapping existing behaviors like
gen_server, you can create powerful, reusable components.
Mastering custom behaviors empowers you to build highly modular and consistent Erlang applications.
Apprends Erlang avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 12
- Leçons
- 48
Questions Fréquemment Posées
La leçon « Comportements OTP personnalisés » est-elle gratuite ?
Oui — le texte complet de « Comportements OTP personnalisés » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Erlang OTP: Distributed & Fault-Tolerant Systems Programming, passe à CoddyKit PRO. Le cours Erlang OTP: Distributed & Fault-Tolerant Systems Programming comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Comportements OTP personnalisés » ?
Comprenez la structure des comportements OTP et apprenez à créer vos propres comportements génériques personnalisés afin d'encapsuler des modèles courants Tu pratiques Erlang OTP: Distributed & Fault-Tolerant Systems Programming avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Erlang OTP: Distributed & Fault-Tolerant Systems Programming ?
Aucune expérience préalable n'est requise. Erlang OTP: Distributed & Fault-Tolerant Systems Programming sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Comportements OTP personnalisés » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Erlang OTP: Distributed & Fault-Tolerant Systems Programming ?
Oui. Chaque leçon Erlang OTP: Distributed & Fault-Tolerant Systems Programming inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- GenStatem pour la gestion de l'état
- GenEvent pour la gestion des événements
- Comportements OTP personnalisés
- Échange de code à chaud et mises à niveau en direct