Behaviors OTP personalizados
Comprenda la estructura de los behaviors OTP y cómo crear sus propios behaviors genéricos personalizados para encapsular patrones comunes.
Behaviors OTP personalizados es una lección gratuita de Erlang OTP: Distributed & Fault-Tolerant Systems Programming en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Erlang OTP: Distributed & Fault-Tolerant Systems Programming, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Erlang OTP: Distributed & Fault-Tolerant Systems Programming incluye 4 lecciones en total.
Partes de esta lección aún no han sido traducidas y se muestran en inglés.
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.
Aprende Erlang con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 12
- Lecciones
- 48
Preguntas frecuentes
¿La lección «Behaviors OTP personalizados» es gratis?
Sí — el texto completo de «Behaviors OTP personalizados» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Erlang OTP: Distributed & Fault-Tolerant Systems Programming, actualiza a CoddyKit PRO. El curso de Erlang OTP: Distributed & Fault-Tolerant Systems Programming incluye 4 lecciones en total.
¿Qué aprenderé en «Behaviors OTP personalizados»?
Comprenda la estructura de los behaviors OTP y cómo crear sus propios behaviors genéricos personalizados para encapsular patrones comunes. Practicas Erlang OTP: Distributed & Fault-Tolerant Systems Programming con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Erlang OTP: Distributed & Fault-Tolerant Systems Programming?
No se requiere experiencia previa. Erlang OTP: Distributed & Fault-Tolerant Systems Programming en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Behaviors OTP personalizados»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Erlang OTP: Distributed & Fault-Tolerant Systems Programming?
Sí. Cada lección de Erlang OTP: Distributed & Fault-Tolerant Systems Programming incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- GenStatem para la gestión del estado
- GenEvent para la gestión de eventos
- Behaviors OTP personalizados
- Intercambio de código en caliente y actualizaciones en vivo