Modern systems need to be able to self-adapt to changes in user needs, and changes affecting the system itself or its environment. Dynamic software product line (DSPL) is an engineering approach for developing self-adaptive systems based on commonalities and variabilities for a family of similar systems. Currently, many DSPL approaches fail to meet all adaptability requirements, and in many cases, they are developed in a such unstructured manner that the controller is not explicitly represented, for example. We specify a two-dimension taxonomy to address basic technical issues for realising variability in DSPLs. The self-adaptation dimension classifies the different design choices for the adaptability requirements. The DSPL variability dimension classifies different design choices for implementing variability schemes and for creating different kinds of feature models. Our study was substantiated by surveying several DSPL approaches and evaluating and comparing their different design strategies. We also summarise practical issues and difficulties, identify major trends in actual DSPL proposals and suggest directions for future.