It is quite possible, and in fact recommended (if you need trigger logic on both events).
See also:
A common pattern is to have three separate layers of code: the trigger itself, a handler, and a service layer. Here's the trigger framework I prefer.
Trigger
trigger CaseTrigger on Case (after insert)
{
EventTriggerHandler handle = new EventTriggerHandler(trigger.new, trigger.oldMap);
if (trigger.isBefore)
{
if (trigger.isInsert) handle.beforeInsert();
if (trigger.isUpdate) handle.beforeUpdate();
// etc
}
if (trigger.isAfter)
{
if (trigger.isInsert) handle.afterInsert();
if (trigger.isUpdate) handle.afterUpdate();
// etc
}
}
Handler
public with sharing class EventTriggerHandler
{
@TestVisible static Boolean bypassTrigger = false;
final List<Event> newRecords;
final Map<Id, Event> oldMap;
public EventTriggerHandler(List<Event> newRecords, Map<Id, Event> oldMap)
{
this.newRecords = newRecords;
this.oldMap = oldMap;
}
public void beforeInsert()
{
if (bypassTrigger) return;
CaseService.doStuff1();
}
public void afterInsert()
{
if (bypassTrigger) return;
CaseService.doStuff2();
}
public void beforeUpdate()
{
if (bypassTrigger) return;
CaseService.doStuff1();
}
public void afterUpdate()
{
if (bypassTrigger) return;
CaseService.doStuff3();
}
}
Service
public with sharing class CaseService
{
public static void doStuff1() { /* "how" implementation */ }
public static void doStuff2() { /* "how" implementation */ }
public static void doStuff3() { /* "how" implementation */ }
}