The holes in your part tops are the result of a combination of poor bridging and too few top layers.
What's happening is that when the printer tries to lay down the first layer of the top/roof, it has to "bridge" over the top layer of the infill. If you are trying to lay down that layer too quickly, with too hot a filament temperature, over too sparse an infill, the lines won't go down properly, and then the next layer over that has to try to bridge this same gap with very little support (and very often with up-curled broken strands of filament in the way).
The printer can eventually lay down a smooth layer, if you give it enough tries to smooth over the rougher, broken layers underneath. How many you need depends on how badly the first one failed to bridge the infill gaps. If you're only printing 2 layers, try 4. If you're printing 4, try 6.
Also, look at your infill percentage and pattern. The top lines have to be drawn over the top of whatever the layer of infill looks like as of when the slicer calculates that the first layer of top needs to go down. Virtually all slicers provide a "preview" of the sliced layers, with some like Cura allowing you to trace through the extruder's "tool path" over each layer. This can be a very useful tool to diagnose potential issues with what the slicer will expect the printer to do.
As for how to change it, it really depends on what you need out of the part in terms of material strength (different patterns have advantages and disadvantages in how much force can be applied in what directions), weight (more infill means heavier), and print time (higher percentages and more complex infill patterns increase print time). Cubic infill has the best overall strength-for-weight, and it slices and prints pretty fast as each layer is just straight lines. However, it's among the worst in terms of the grid it provides under the top layer. Isolinear/Triangle fill provides one of the better support structures, and is near the top in Z-axis compressive strength, but compressive strength other than in the Z-axis tends to be low. Gyroid infill has among the best combinations of strength, weight and required bridging distances, but slicing and printing the complex curved structure takes more time, and some slicers don't offer it (I'm still kicking around with an old MakerBot that's only fully supported by MakerBot Desktop, which doesn't offer any "fully 3D" fills like cubic or gyroid at all).
Lastly, if you absolutely need the model at a light weight or fast print time that precludes increasing the infill or slowing print head speed, try printing a bridging test, especially something like a "temperature tower" that allows you to see the effects of varying extrusion temperature all in one model, and make sure you're printing at the exact temperature giving you the best results for the other configuration settings you're using. Your model may not require externally-visible bridging or overhangs, but the ability to draw a long line of filament literally into thin air without sagging or snapping is a useful trick even in "solid" object prints, because as you've found out, these solid shapes are up to 90% air inside.