можно писать стили для условного класса .button так, чтобы они работали и для A, и для BUTTON, и даже для INPUT (с type = button) одинаково. Хотя, конечно, сейчас такое оформление бывает, что инпуту все детали не прикрутишь, ну да и ладно - ссылки или button должно хватить для всего. А далее в верстке/на проекте применяешь с этим классом нужный тэг по вкусу/желанию/назначению.
а насчет с помощью какие правил делать - так зависит от задачи. "просто кнопке" хватит паддингов, если кнопку надо ровнять по высоте с инпутами или еще чем - надо фиксировать высоту. всегда - от задачи.