let me explain:

FactoryIdHelper is used to read Factory IDs from System Properties by default and if not available such a property use default value passed to it...

An example:
FactoryIdHelper.getFactoryId(FactoryIdHelper.CLIENT_DS_FACTORY, -3);

the problem here is that two tightly coupled values are passed separately so I combined them into one enum in FactoryIdRepository...

The disadvantage of FactoryIdHelper is 

1. You define a property name for each Portable Module
2. You define a property name for each DS Module
3. Default values are not defined in the class but passed by caller class
4. Defining a property with a naming convention without any external check is error prone. 
You can easily make typos.. public static final String SPI_PORTABLE_FACTORY = "hazelcast.serialization.portable.spi";
5. Both Portable and DS properties has to follow the same naming convention.
6. Both Portable and DS Default values must be the same for each module
7. All those definitions above must be known by the developer implicitly in advance so that he can add a new module without any mistake

I think that is sufficient for now. I can add more problems with FactoryIdHelper.

If you need to define a new component, you just need to add a new ENUM into FactoryIdRepository. 
**NEW_COMPONENT(component_id);**
It is that simple( following KISS principle) then ENUM handles automatically all potential problems defined above..

*How to use FactoryIdRepository*

**FactoryIdRepository.getPortableFactoryId(FactoryIdRepository.CLIENT);** 
**FactoryIdRepository.getDSFactoryId(FactoryIdRepository.CLIENT);**

Your suggestion to add CONSTANTS to DataSerializerHook and (possibly PortableHook) and  keeping FactoryIdHelper will make property definition and default values defined in separate places.

If you didnt like the name, that is ok... We can change the name of FactoryIdRepository if you come up with a better name...

I hope that helps...